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>/)
posted @ 2021-12-25 22:47  枫·影  阅读(1236)  评论(0编辑  收藏  举报