目录
1.基本框架
cmake_minimum_required (VERSION 3.6)
project (box)
add_executable(box box.cxx)
cmake_minimum_required()
- 作用:指定运行此配置文件所需的 CMake 的最低版本;
注意:cmake的语法支持大小、小写和大小写混合。
- cmake_minimum_required
- CMAKE_MINIMUM_REQUIRED
- cmake_MINUMUM_required
上面三种写法是相同的,只有系统指令是不区分大小写的,但是变量和字符串是区分大小写的。
project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
- 作用:定义工程名称和支持的语言
- 变量: PROJECT_SOURCE_DIR,PROJECT_BINARY_DIR
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
- 作用:生成可执行文件
add_executable(mytool mytool.cpp)
2.include_directories
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
作用:
将dir1 [dir2 ...] 文件夹下的头文件添加到编译环境中;
AFTER 或者 BEFORE 指定了要添加的路径是添加到原有包含列表之前或之后
若指定 SYSTEM 参数,则把被包含的路径当做系统包含路径来处理
3. find_package
find_package(<package> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [[COMPONENTS] [components...]] [OPTIONAL_COMPONENTS components...] [NO_POLICY_SCOPE])
- version参数:版本号,它是正在查找的包应该兼容的版本号(格式是major[.minor[.patch[.tweak]]])。
- REQUIRED 参数:指是否是工程必须的,如果没有找到的话,cmake的过程会终止,并输出警告信息。对应于Find<name>.cmake模块中的 NAME_FIND_REQUIRED 变量。
- COMPONENTS参数:在它们的后面可以列出一些与包相关依赖的部件清单(components list)
- 生成的变量:
<NAME>_FOUND//是否找到库的标志 <NAME>_INCLUDE_DIRS or <NAME>_INCLUDES//库的头文件路径 <NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS//库文件路径 <NAME>_DEFINITIONS
find_package如何工作的:
https://blog.csdn.net/bytxl/article/details/50637277
https://blog.csdn.net/chengde6896383/article/details/86497016
4.link_libraries
link_libraries(library1 <debug | optimized> library2 ...)
- 作用:将库链接到以后添加的所有目标
- 例如:
link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
- 不推荐使用。请改用target_link_libraries()命令。
5.target_link_libraries
target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)
- 作用:将目标文件与库文件进行链接。
- 区别:target_link_libraries 要在 add_executable 之后;link_libraries 要在 add_executable 之前
上述指令中的<target>是指通过add_executable()和add_library()指令生成已经创建的目标文件。而[item]表示库文件没有后缀的名字。默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在interface_link_libraries的目标属性中,可以通过设置该属性直接重写传递接口。
target_link_libraries(myProject comm) # 连接libhello.so库,默认优先链接动态库 target_link_libraries(myProject libcomm.a) # 显示指定链接静态库 target_link_libraries(myProject libcomm.so) # 显示指定链接动态库
6. add_library
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2] [...])
- 作用:生成链接库
- <name>:库文件的名字,该库文件会根据命令里列出的源文件来创建。
- STATIC、SHARED和MODULE:指定生成的库文件的类型。
add_library(archive archive.cpp zip.cpp lzma.cpp) add_executable(zipapp zipapp.cpp) target_link_libraries(zipapp archive)
上述例子中
arvhive
被定义为一个静态库,包含来自archive.cpp
,zip.cpp
,lzma.cpp
的编译后的对象。zipapp
是一个可执行文件通过编译链接zipapp.cpp
得到。在链接zipapp
可执行文件时,archive
静态库会被链入。
7. add_subdirectory
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
- 作用:添加子目录,主要用于多模块的构建
例子1:以子模块sub2依赖子模块sub1。
- 目录结构为:
- 主要内容 :
例子2:
- 根目录中的 CMakeLists.txt :
# CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 项目信息 project (Demo3) # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_SRCS 变量 aux_source_directory(. DIR_SRCS) # 添加 math 子目录 add_subdirectory(math) # 指定生成目标 add_executable(Demo main.cc) # 添加链接库 target_link_libraries(Demo MathFunctions)
- 子目录中的 CMakeLists.txt:
# 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(. DIR_LIB_SRCS) # 生成链接库 add_library (MathFunctions ${DIR_LIB_SRCS})
add_subdirectory
指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理 。第6行,使用命令target_link_libraries
指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库 。
8.设置CMAKE_CXX_FLAGS
变量
set(CMAKE_CXX_COMPILER "clang++" ) # 显示指定使用的C++编译器
set(CMAKE_CXX_FLAGS "-std=c++11") # c++11
set(CMAKE_CXX_FLAGS "-g") # 调试信息
set(CMAKE_CXX_FLAGS "-Wall") # 开启所有警告
set(CMAKE_CXX_FLAGS_DEBUG "-O0" ) # 调试包不优化
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " ) # release包优化
9.aux_source_directory
aux_source_directory(<dir> <variable>)
- 作用:查找dir路径下的所有源文件,保存到variable变量中
aux_source_directory(./src ${hello_src})
上面的例子中,
hello_src
是一个自定义变量,在执行了aux_source_directory(./src ${hello_src})
之后,就可以像这样来添加一个可执行文件:add_executable(hello ${hello_src})
, 意思是用hello_src
里面的所有源文件来构建hello可执行程序, 不用手动列出src目录下的所有源文件了。
参考:
http://ijinjay.github.io/blog/2017-04/CMake%E4%BD%BF%E7%94%A8.html