CmakeLists.txt 文件内容详细讲解

本文详细介绍CMake工具的基础使用,包括设置最低版本、工程命名、编译模式、C++11支持、变量添加、依赖管理、头文件引入、可执行文件与库构建、链接配置及调试技巧,适合初学者快速掌握CMake核心功能。

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

转自:https://blog.youkuaiyun.com/qq_21950671/article/details/102660518

声明 cmake 最低版本
声明 cmake 工程名字
设置 cmake 编译模式
添加c++11标准支持
添加变量
添加依赖
添加头文件
添加一个可执行程序
构建静态库
构建静动态库或者共享库
将库文件链接到可执行程序上
指定安装地址
Debug和Release版本
调试手段
CMake常用变量
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库。

CMake的核心是读取文件“CMakeLists.txt”,运行“cmake”命令时,它会寻找这个文件,根据里面的内容生成标准的 Makefiles,这里的“CMakefiles.txt”和用来生成 Makefiles 的文件是一致的。

声明 cmake 最低版本
定义cmake的最低版本时2.8
cmake_minimun_required(VERSION 2.8)
可以在终端中查看cmake的版本

cmake -version
输出如下
cmake version 3.2.2

这里需要注意两点,如果不定义需要的版本可能会报个warning,如果有强迫症或者追求完美,还是把这行代码写上吧。第二点,不要定义的版本比自己安装的版本还高,那样估计就是直接编译不通过了。

声明 cmake 工程名字
project( HelloSLAM )

PROJECT_SOURCE_DIR
项目根目录,也就是CmakeLists.txt目录的绝对路径。

设置 cmake 编译模式
set( CMAKE_BUILD_TYPE “Debug” )

添加c++11标准支持
注意等式左右两端不要加空格
set(CMAKE_CXX_FLAGS “-std=c++11”)

有的时候可能会遇到,一定要注意是大写的O,不是数字0
set(CMAKE_CXX_FLAGS “-std=c++11 -O3”)

其中,参数CMAKE_CXX_FLAGS含义是: set compiler for c++ language
而后面的-O3(是字母opq的o,大写的欧)是用来调节编译时的优化程度的,最高为-O3,最低为-O0(即不做优化)

-Ox这个参数只有在CMake -DCMAKE_BUILD_TYPE=Release时有效,因为debug 版的项目生成的可执行文件需要有调试信息并且不需要进行优化,而 release 版的不需要调试信息但需要优化。

添加变量
下面讲解如何为程序添加版本号和带有使用版本号的头文件。
set(KEY VALUE)接受两个参数,用来声明变量。
在camke语法中使用KEY并不能直接取到VALUE,必须使用${KEY}这种写法来取到VALUE。
Create variables used for exporting in SophusConfig.cmake
set( Sophus_INCLUDE_DIR ${PROJECT_SOURCE_DIR} )

添加依赖
find_package( Sophus REQUIRED )
find_package( Pangolin )

opencv
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

eigen
include_directories( “/usr/include/eigen3/” )

pcl
find_package( PCL REQUIRED COMPONENT common io )
include_directories( ${PCL_INCLUDE_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )

在CMakeLists.txt如果需要使用第三方库,那么需要知道三个东西
去哪里找头文件(.h等) 对应于GCC的参数 -I
去哪里找库文件(.so/.lib/.ddl等) 对应于GCC的参数 -L
需要链接的库文件名称 对应于GCC的参数 -l

比如我需要链接第三方库curl,那么在CMakeLists.txt中可以书写如下:
include_directories(/usr/include) # 对应于-I
target_link_libraries(target curl) # 对应于 -L和-l
find_package的作用就是去寻找该库的头文件位置、库文件位置以及库文件名称,并将其设为变量,返回提供给CMakeLists.txt其他部分使用。

添加头文件
include_directories( “/usr/include/eigen3” )
include_directories( ${Pangolin_INCLUDE_DIRS} )
include_directories( ${Sophus_INCLUDE_DIRS} )

添加一个可执行程序
语法:add_executable( 程序名 源代码文件 )
add_executable( helloSLAM helloSLAM.cpp )

构建静态库
add_library( hello libHelloSLAM.cpp )
生成静态库".a"文件

构建静动态库或者共享库
add_library( hello_shared SHARED libHelloSLAM.cpp )

生成动态库".so"文件
add_executable( useHello useHello.cpp )

构建大型项目时可以为使用这个库添加一个开关
在项目根目录下的CMakeLists.txt文件中添加如下代码:
option (USE_MYMATH “Use tutorial provided math implementation” ON)

将库文件链接到可执行程序上
target_link_libraries( useHello hello_shared )
target_link_libraries( imageBasics ${OpenCV_LIBS} )
target_link_libraries( joinMap ${OpenCV_LIBS} ${PCL_LIBRARIES} )

指定安装地址
第一种方式:
使用 CMAKE_INSTALL_PREFIX 来指定

cmake -DCMAKE_INSTALL_PREFIX=/usr …

第二种方式:
修改cmake文件,加入:

SET(CMAKE_INSTALL_PREFIX < install_path >)

Debug和Release版本
debug 版的项目生成的可执行文件需要有调试信息并且不需要进行优化,、
release 版的不需要调试信息但需要优化。这些特性在 gcc/g++ 中是通过编译时的参数来决定的,如果将优化程度调到最高需要设置参数-O3,最低是 -O0 即不做优化;添加调试信息的参数是 -g -ggdb ,如果不添加这个参数,调试信息就不会被包含在生成的二进制文件中。

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CMAKE_SOURCE_DIR .)

SET(CMAKE_CXX_FLAGS_DEBUG"ENVCXXFLAGS−O0−Wall−g−ggdb")SET(CMAKECXXFLAGSRELEASE"ENV{CXXFLAGS} -O0 -Wall -g -ggdb")SET(CMAKE_CXX_FLAGS_RELEASE"ENVCXXFLAGS−O0−Wall−g−ggdb")SET(CMAKE 
C
​    
 XX 
F
​    
 LAGS 
R
​    
 ELEASE"ENV{CXXFLAGS} -O3 -Wall")

AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})

两个变量 CMAKE_CXX_FLAGS_DEBUG 和CMAKE_CXX_FLAGS_RELEASE, 分别用于 debug 和 release 的编译选项。编辑 CMakeList.txt 后需要执行 ccmake 命令生成 Makefile 。在进入项目的根目录,输入 “ccmake .” 进入一个图形化界面。

调试手段
message

打印信息,类似于 echo/printf ,主要用于查cmake文件的语法错误。

set(mysql_use_test_sources ${SOURCES_DIRECTORY}/test_sources/mysql_user_accounts.cpp)
message(“mysql_use_test_sources : ${mysql_use_test_sources}”)

CMake常用变量
CMAKE_STATIC_LIBRARY_PREFIX 静态库前缀, Linux下默认为lib
CMAKE_STATIC_LIBRARY_SUFFIX 静态库后缀,Linux下默认为.a
CMAKE_SHARED_LIBRARY_PREFIX 动态库前缀,Linux下默认为lib
CMAKE_SHARED_LIBRARY_SUFFIX 动态库后缀,Linux下默认为.so

CMAKE_BUILD_TYPE 指定基于make的产生器的构建类型(Release,Debug)
CMAKE_C_FLAGS *.C文件编译选项,如 -std=c99 -O3 -march=native
CMAKE_CXX_FLAGS *.CPP文件编译选项,如 -std=c++11 -O3 -march=native

CMAKE_RUNTIME_OUTPUT_DIRECTORY 生成可执行文件路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY 生成库的文件夹路径

<think>好的,用户想了解如何创建和配置CMakeLists.txt文件来构建工程项目。我需要根据提供的引用内容,特别是引用1、2、3中的信息,整理出一个清晰的教程和示例。 首先,我应该从基础结构开始,说明CMakeLists.txt的基本组成部分。比如,项目名称、CMake最低版本要求,这些是每个CMakeLists.txt的基础。引用2提到目录结构,包括build和src目录,可能需要说明如何组织项目结构。 然后,添加可执行文件的部分,需要包含add_executable命令,并指定源文件路径。比如,引用2中的main.cpp在src目录下,这里可能需要设置源文件变量,或者直接引用。 接下来,包含头文件目录,使用include_directories,特别是如果有第三方库的话。引用3提到了OpenCV的配置,可能需要说明如何添加包含路径,比如OpenCV的头文件路径。 然后,链接库的部分,使用target_link_libraries。引用3中提到了配置OpenCV库,需要修改CMakeLists.txt,添加find_package和target_link_libraries的步骤。这里可能需要详细说明如何查找库并链接。 另外,用户可能需要了解如何构建项目,引用1提到使用cmake .和make命令,在build目录下进行构建,避免污染源代码。这部分需要给出具体的终端操作步骤。 最后,给出一个完整的示例,整合各个部分,并添加注释说明。同时,结合引用中的案例,比如OpenCV的配置,展示如何修改CMakeLists.txt来适配实际项目。 还需要生成相关问题,可能涉及性能优化、多目录项目处理、外部库集成等,参考用户之前的示例问题结构。 检查是否遵循了系统级指令:行内公式是否正确使用$,独立公式是否用$$,中文回答,正确引用标记。但当前问题主要涉及CMake配置,可能不涉及数学公式,所以这部分可能不需要。但需要确保引用标记正确添加,比如在提到构建步骤时引用[^1],目录结构引用[^2],库配置引用[^3]。 现在需要组织内容结构,分步骤讲解,每个步骤结合引用内容,并给出代码示例。确保用户能够按照教程一步步配置自己的CMakeLists.txt文件。</think>以下是创建和配置$CMakeLists.txt$文件的基础教程及示例,结合引用内容进行说明: --- ### **一、CMakeLists.txt基础结构** 1. **最低版本要求** ```cmake cmake_minimum_required(VERSION 3.10) ``` 2. **定义项目名称** ```cmake project(MyProject) ``` --- ### **二、添加可执行文件** 1. **指定源文件路径** 若源代码在`src`目录下(如引用[^2]的结构),需添加: ```cmake set(SOURCE_FILES src/main.cpp) ``` 2. **生成可执行文件** ```cmake add_executable(MyProject ${SOURCE_FILES}) ``` --- ### **三、包含头文件目录** ```cmake include_directories( ${PROJECT_SOURCE_DIR}/include # 自定义头文件目录 # 第三方库头文件路径,如OpenCV(参考引用[^3]) /usr/local/include/opencv4 ) ``` --- ### **四、链接第三方库** 以OpenCV为例(参考引用): ```cmake find_package(OpenCV REQUIRED) target_link_libraries(MyProject ${OpenCV_LIBS}) ``` --- ### **五、构建项目** 1. **终端操作**(参考引用) ```bash mkdir build && cd build cmake .. # 生成Makefile make # 编译项目 ``` --- ### **六、完整示例** ```cmake cmake_minimum_required(VERSION 3.10) project(MyDemo) # 添加源文件 set(SOURCE_FILES src/main.cpp) # 生成可执行文件 add_executable(MyDemo ${SOURCE_FILES}) # 包含OpenCV库(参考引用[^3]) find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(MyDemo ${OpenCV_LIBS}) ``` --- ### **七、进阶配置** - **多目录项目**:使用`add_subdirectory()`管理子模块(参考引用目录结构) - **生成静态库**:`add_library(mylib STATIC src/mylib.cpp)` - **条件编译**:`if()/else()/endif()`控制编译选项 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值