cmake学习(一) CMakeLists.txt 配置参数
设置cmake版本
cmake_minimum_required (VERSION 3.8)
设置项目名称
project ("CMakeProject1")
设置参数
设置c++ 11 支持
// 设置c++ 11 支持
set(CMAKE_CXX_STANDARD 11)
// 设置开启标准要求
set(CMAKE_CXX_STANDARD_REQUIRED ON)
// 关闭c++ 扩展
set(CMAKE_CXX_EXTENSIONS OFF)
安装目录
//CMAKE_INSTALL_PREFIX变量类似于configure脚本的 –prefix
set(CMAKE_INSTALL_PREFIX .)
set(CMAKE_INSTALL_PREFIX /usr .)
支持cuda
find_package(CUDA)
设置参数及目录
// 以 nvidia video sdk 为例
// 设置参数地址
set(NVCODEC_PUBLIC_INTERFACE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Interface)
set(NVCODEC_UTILS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utils)
set(NV_CODEC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/NvCodec)
set(NV_ENC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/NvCodec/NvEncoder)
set(NV_DEC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/NvCodec/NvDecoder)
set(NV_APPENC_COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AppEncode/Common)
set(NV_APPDEC_COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AppDecode/Common)
根据当前系统设置不同的参数
// CMAKE_SIZEOF_VOID_P 是判断依据 4代表32位 8代表64位
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
else()
endif()
// WIN32 是判断依据 true是windows平台 false是其他平台
if(WIN32)
else ()
endif()
// CMAKE_SYSTEM_NAME 是判断依据 Linux是Linux平台
// STREQUAL 是 CMAKE 的关键字,用于字符串比较
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
endif()
通过PkgConfig搜索添加库
// 通过PkgConfig搜索库文件
find_package(PkgConfig REQUIRED)
// 检索PC_AVCODEC REQUIRED:如果找不到模块,命令将失败并报错(QUIET:不会打印任何状态消息) IMPORTED_TARGET:创建一个名为PkgConfig::< prefix>的导入目标,该目标可以作为参数直接传递给target_link_libraries()
pkg_check_modules(PC_AVCODEC REQUIRED IMPORTED_TARGET libavcodec)
pkg_check_modules(PC_AVFORMAT REQUIRED IMPORTED_TARGET libavformat)
pkg_check_modules(PC_AVUTIL REQUIRED IMPORTED_TARGET libavutil)
pkg_check_modules(PC_SWRESAMPLE REQUIRED IMPORTED_TARGET libswresample)
通过find_library查找库 一般是Linux下
// AVCODEC_LIBRARY:创建名为的缓存条目以存储此命令的结果,如果找到了库,结果将存储在变量中,除非清除变量,否则将不
// 会重复搜索,如果什么也没找到,结果将是-NOTFOUND,REQUIRED如果未找到任何内容,该选项将停止处理并显示一条错误消息,
// 否则,下次使用相同的变量调 用find_library时,将再次尝试搜索.
// NAMES 为库指定一个或多个可能的名称。
// HINTS, PATHS 除了默认位置,还指定要搜索的目录。该子选项读取系统环境变量的路径。
// DOC 指定缓存条目的文档字符串。
find_library(AVCODEC_LIBRARY NAMES avcodec
HINTS
${PC_AVCODEC_LIBDIR}
${PC_AVCODEC_LIBRARY_DIRS}
)
引用路径
include_directories()
target_include_directories()
add_executable( xx.cpp xx.h)
这三种方式都可以对当前项目添加引用路径。
include_directories
影响范围最大,可以为CMakelists.txt后的所有项目添加头文件目录
一般写在最外层CMakelists.txt中影响全局
target_include_directories
影响范围可以自定义。如加关键子PRIVATE或这PUBLIC。
一般引用库路径使用这个命令,作为外部依赖项引入进来,target是自己项目生成的lib。
project(myLib)
target_include_directories(myLib PRIVATE ${OpenCV_Include_dir})
add_executable
添加的引用路径一般是当前目录下的源文件对应的头文件。是生成项目时引入的头文件。
这种方式一般用于自己写的或某项目需要的头文件,这种方式需要加添加文件名字,而非头文件目录
project(addFunc)
add_executable(addFunc addFunc.h addFunc.cpp)
声明引入子项目(目录)
add_subdirectory(onedll)
添加宏定义
add_definitions()
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
添加到cuda
// 可执行程序
cuda_add_executable()
// 库
CUDA_ADD_LIBRARY()
配置安装目录
install(TARGETS MyLib
EXPORT MyLibTargets
LIBRARY DESTINATION lib # 动态库安装路径
ARCHIVE DESTINATION lib # 静态库安装路径
RUNTIME DESTINATION bin # 可执行文件安装路径
PUBLIC_HEADER DESTINATION include # 头文件安装路径
)
连接库的头文件路径
target_link_libraries(${PROJECT_NAME} ${CUDA_CUDA_LIBRARY} ${CMAKE_DL_LIBS} ${NVENCODEAPI_LIB} ${CUVID_LIB} ${AVCODEC_LIB}
${AVFORMAT_LIB} ${AVUTIL_LIB} ${SWRESAMPLE_LIB})
自定义命令
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${FFMPEG_DLL_DIR} ${NVCODEC_SAMPLES_INSTALL_DIR}/$<CONFIG>/)