cmake 学习笔记
最近接触到一些工程上的代码,都是用cmake来编译的,每次看着CMakeLists.txt就各种懵逼,决定从0开始学习
1set
set(varhello) message(${var})
输出
hello
其实并不是单单输出hello,还有很多其他信息,会生成很多文件
files
2CMAKE_C(XX)_FLAGS
变量CMAKE_C_FLAGS存放的内容会被传给C编译器,作用在所有的编译组态上。如果希望只针对特定一种组态有效,可以设定CMAKE_C_FLAGS_<编译组态>,例如CMAKE_C_FLAGS_RELEASE、CMAKE_C_FLAGS_DEBUG。
set(CMAKE_C_FLAGS"${CMAKE_C_FLAGS} -Wall-O3-march=native-Wno-reorder")
set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}-Wall-O3-march=native-Wno-reorder")
编译选项为-WallO3的优化
其他内部变量:
•CMAKE_C_COMPILER:指定C编译器
•CMAKE_CXX_COMPILER:
•CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项
•EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径
•LIBRARY_OUTPUT_PATH:库文件路径
•CMAKE_BUILD_TYPE::build类型(Debug,Release,...),
•CMAKE_BUILD_TYPE=Debug
•BUILD_SHARED_LIBS:Switchbetweensharedandstaticlibraries
内置变量的使用:
•在CMakeLists.txt中指定,使用set
•cmake命令中使用,如cmake-DBUILD_SHARED_LIBS=OFF
3CHECK_CXX_COMPILER_FLAG
检查CXX编译器是否支持给定的flag
必须先include(CheckCXXCompilerFlag)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG(
e.g.
CHECK_CXX_COMPILER_FLAG("-std=c++11"COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x"COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}-std=c++11") add_definitions(-DCOMPILEDWITHC11) message(STATUS"Usingflag-std=c++11.") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}-std=c++0x") add_definitions(-DCOMPILEDWITHC0X) message(STATUS"Usingflag-std=c++0x.") else() message(FATAL_ERROR"Thecompiler${CMAKE_CXX_COMPILER}hasnoC++11support.PleaseuseadifferentC++compiler.") endif()
上面的代码很直接
就是在检查当前编译器是否支持c++11
CHECK_CXX_COMPILER_FLAG赋值给的var是个bool型
4add_definitions
添加编译参数
add_definitions(-DDEBUG)
将在gcc命令行添加DEBUG宏定义,那么你就可以在你的源文件里面对DEBUG宏来操作
5ENV
语法:
$ENV(VAR)#读取环境变量VAR,也可用set对其赋值
eg:
IF(DEFINEDENV{ARM_ARCHITECTURE})#如果是arm的机器
6list
List操作
list(LENGTH
) list(GET
[ ...] ) list(APPEND [
...]) list(FIND
) list(INSERT
[ ...]) list(REMOVE_ITEM
[ ...]) list(REMOVE_AT
[ ...]) list(REMOVE_DUPLICATES ) list(REVERSE
) list(SORT
)
APPEND追加元素,懂了吧,这些都是list的操作
7CMAKE_MODULE_PATH
cmake进行搜索的modules的list,它是一个list
8find_package
这个有点复杂,还是直接看官方文档
还有这个
9include_directories
增加头文件的搜索路径,相当于指定gcc的-I参数
include_directories([AFTER|BEFORE][SYSTEM]dir1[dir2...])
10add_library
add_library(
[EXCLUDE_FROM_ALL]
source1[source2...])
增加库的目录
11target_link_libraries
target_link_libraries(
[[debug|optimized|general]
指令target_link_libraries()用于指定target所需要链接的库,还可以有不同的选项。
e.g.
target_link_libraries(myapp debug-labc optimized-lxyz )
myapp在debugbuild时会链接libabc.a,在releasebuild时会链接libxyz.a,他们的目录被add_library命令添加进去了
12add_executable
增加可执行文件(从源文件)
add_executable(
[EXCLUDE_FROM_ALL]
source1[source2...])
e.g.
add_executable(stereo_eurocExamples/Stereo/stereo_euroc.cc) target_link_libraries(stereo_euroc${PROJECT_NAME})
stereo_euroc是要生成的可执行文件,源码是后面的.cc文件,链接后面的库