CMakeLists写法总结

本文介绍了CMakeLists的常见写法,包括设置最低版本、项目名称、查找外部库、设置源文件路径等,并以OpenCV为例说明如何配置库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人最近学习了一些关于常见的CMakeLists的一些写法格式,分享给大家。

    CMAKE_MINIMUM_REQUIRED(VERSION xxx) 该项表示要求CMAKE的最低版本号.

    PROJECT(aim1) 此项表示所建立的工程名称 aim1;

    FIND_PACKAGE(xxx)该命令首先会在模块路径中寻找 Find<name>.cmake,这是查找库的一个典型方式。具体查找路径依次为CMake: 变量${CMAKE_MODULE_PATH}中的所有目录。如果没有查询到,随后会查看它自己的模块目录 /share/cmake-x.y/Modules/ ;

     如果没找到这样的文件,find_package()会在~/.cmake/packages//usr/local/share/中的各个包目录中查找,寻找<库名字的大写>Config.cmake 或者 <库名字的小写>-config.cmake (比如FIND_PACKAGE(Opencv REQUIRED),它会查找/usr/local/share/OpenCV中的OpenCVConfig.cmakeopencv-config.cmake)。个人认为这是CMake内置的快速查找方法

   SET( SRC_DIR_PATH src ),SET命令是用来设置变量,换句话说就是给变量赋值,例如本条命令表示SRC_DIR_PATH=src,注意这里的src代表Cmakelists的相对路径,即目录内的src文件夹,。SRC_DIR_PATH表示源文件目录路径。

    FILE(GLOB_RECURSE SOURCE_FILES "src/*.cpp"),FILE文件命令具体包括许多,在这里使用GLOB_RECURSE 代表把该目录(src下)的所有源文件都赋予变量SOURCE_FILES。

   INCLUDE_DIRECTORIES(xxx/include),INCLUDE就像源文件内的include一样,用来设置头文件。这里是用来设置头文件的搜索目录。告诉CMake,编译的时候去哪里找头文件。

   LINK_DIRECTORIES(xxx/lib),LINK就是链接的意思,lib是库,该命令就是要链接库,设置动态链接库的目录,例如链接caffe,可以表示为LINK_DIRECTORIES(/home/usr/caffe/build/lib)。既然已经设置好了链接库的目录,那么具体需要链接哪些库,需要通过下面的操作完成。

   SET( LIB_PROJECT caffe glog boost_system protobuf boost_thread gflags ),该命令是在设置链接库文件的名称。

   随后,需要在ADD_EXECUTABLE()命令后写出TARGET_LINK_LIBRARIES(aim1 ${LIB_PROJECT}),要链接的动态库, 参数指明库的名字即可,比如libcaffe.so,这里是需要加上lib前缀和.so后缀的,或者以变量的形式表示。而上条设置名称时,不需要这些前后缀。

   ADD_EXECUTABLE(TARGET ${PUBLIC_SRC_FILE} ${SRC_DIR_PATH}/detect_read_video_mixture.cpp ),生成可执行文件,需要将生成的名称和TARGET_LINK_LIBRARIES必须保持一致。

message( STATUS "hello world"),message命令就是向终端窗口发送消息,例如本条命令就是发送hello world。

 

 

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
# 指定工程名称
PROJECT(abc)
set(CMAKE_CXX_FLAGS "-std=c++11")

# 导入OpenCV库
FIND_PACKAGE( OpenCV REQUIRED )

# 设置源文件
SET( SRC_DIR_PATH src )
FILE(GLOB_RECURSE SOURCE_FILES "src/*.cpp")

# 设置头文件搜索目录
SET( CAFFE_ROOT /home/kevin/SSD/caffe)
SET( CUDA_HOME /usr/local/cuda-8.0 )
INCLUDE_DIRECTORIES(${CAFFE_ROOT}/include/ ./include/ ${CAFFE_ROOT}/.build_release/src/ ${CUDA_HOME}/include/ )

# 设置动态库链接目录
LINK_DIRECTORIES( ${CAFFE_ROOT}/build/lib/ ${CUDA_HOME}/lib64/)

# 设置要链接的库文件
SET( LIB_PROJECT caffe glog boost_system protobuf boost_thread gflags)

# 指定执行文件输出目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 生成可执行文件,即程序
ADD_EXECUTABLE( abc ${PUBLIC_SRC_FILE} ${SRC_DIR_PATH}/test.cpp  )

# 要链接的动态库, 参数指明库的名字即可,比如libxxxx1.so, 指明是xxxx1即可!!!
TARGET_LINK_LIBRARIES( abc ${LIB_PROJECT} ${OpenCV_LIBS} )

 

<think>好的,用户想了解如何正确配置OpenCV项目的CMakeLists.txt文件。首先,我需要回忆一下相关的知识,并结合提供的引用内容来组织答案。 根据引用[1],在Ubuntu下使用CMake编译OpenCV程序时,需要使用find_package来查找OpenCV,然后通过${OpenCV_INCLUDE_DIRS}和${OpenCV_LIBS}来引用头文件和库。引用[3]提到CMakeLists.txt的基本结构,包括项目定义、源文件指定、依赖配置等。引用[4]提到使用${PROJECT_NAME}来引用项目名称,这可能用于可执行文件的命名。引用[2]和[5]强调了正确配置路径和检查错误的重要性。 首先,用户可能需要一个基本的模板。步骤应该是:1. 指定CMake最低版本;2. 定义项目名称;3. 查找OpenCV包;4. 添加可执行文件;5. 链接OpenCV库。需要注意正确使用变量,比如target_include_directories可能需要用${OpenCV_INCLUDE_DIRS},而target_link_libraries用${OpenCV_LIBS}或者更现代的OpenCV:: targets。引用[1]中的例子使用了旧式变量,但现代CMake推荐使用targets方式,如OpenCV::OpenCV,这样更简洁,且自动处理依赖关系。不过要确认用户的OpenCV版本是否支持。 此外,需要提醒用户处理路径问题,特别是如果OpenCV安装在非标准路径,可能需要设置OpenCV_DIR变量。还要注意CMake语法,比如命令的大小写不敏感,但习惯使用小写。最后,建议用户测试配置,运行cmake和make命令,并检查错误。 可能用户遇到的问题包括找不到OpenCV,这时候应该检查find_package是否正确,或者手动指定路径。另外,确保CMakeLists.txt没有语法错误,比如漏掉括号或拼写错误,如引用[5]所述。还可以推荐引用[1]提到的文章,提供更多CMake语法实例。 总结回答的结构应该是分步骤说明,给出代码示例,并附上注意事项和相关问题的建议。</think>### 如何正确配置OpenCV的CMakeLists.txt文件 #### 基本配置步骤 1. **指定CMake最低版本和项目信息** ```cmake cmake_minimum_required(VERSION 3.12) # 根据实际需求调整版本 project(YourProjectName) # 使用${PROJECT_NAME}引用项目名[^4] ``` 2. **查找OpenCV依赖包** ```cmake find_package(OpenCV REQUIRED) # REQUIRED表示必须找到OpenCV,否则报错[^1] ``` 3. **添加可执行文件并链接库** ```cmake add_executable(${PROJECT_NAME} main.cpp) # 替换为实际源文件 target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS}) # 包含头文件路径[^1] target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS}) # 链接OpenCV库[^1] ``` #### 完整配置示例 ```cmake cmake_minimum_required(VERSION 3.12) project(ImageProcessor) # 查找OpenCV find_package(OpenCV REQUIRED) # 添加可执行文件 add_executable(${PROJECT_NAME} src/main.cpp src/image_processing.cpp) # 包含头文件路径 target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS}) # 链接OpenCV库 target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS}) ``` #### 注意事项 1. **路径问题** - 若OpenCV安装在非标准路径(如自定义编译),需通过`-DOpenCV_DIR=/path/to/opencv/build`传递给CMake[^2]。 - 检查CMake输出是否包含`Found OpenCV: ...`确认查找成功。 2. **现代CMake推荐写法** ```cmake target_link_libraries(${PROJECT_NAME} PRIVATE OpenCV::OpenCV) # 更简洁的现代语法 ``` 此写法自动处理头文件和依赖关系,无需手动添加`include_directories`[^3]。 3. **调试与验证** - 若出现`No package 'OpenCV' found`,检查环境变量或手动指定路径[^5]。 - 使用`message(STATUS "OpenCV libraries: ${OpenCV_LIBS}")`打印变量值辅助调试[^4]。 #### 扩展配置(可选) - **添加C++标准要求** ```cmake set(CMAKE_CXX_STANDARD 11) # 根据OpenCV版本需求设置 ``` - **多文件项目配置** ```cmake file(GLOB SOURCES "src/*.cpp") # 自动收集源文件 add_executable(${PROJECT_NAME} ${SOURCES}) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值