CmakeLists.txt 文件内容详细讲解

转自:https://blog.csdn.net/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 生成库的文件夹路径

你可能感兴趣的:(CmakeLists.txt 文件内容详细讲解)