本文只用于本人学习记录,编写逻辑可能不是很清楚,不适合初学者阅读学习。
1. Cmake简介
- 目的:自动生成Makefile文件,进而编译工程
- 优势:跨平台,语言友好易懂,可编写性强
2. Linux下使用步骤
- 编写 CMake 配置文件 CMakeLists.txt 。
- 执行命令
cmake PATH
或者ccmake PATH
,生成Makefile文件。 - 执行命令
make
,进行编译。
经典的使用方法是:
在工程主目录下建立一个build
文件,在build文件里执行命令cmake ..
,这样产生的所有中间文件都会存在build
文件里,不会污染工程文件空间。
3. 编写实战
1)cmake有很多预配变量,以下总结一些经常用到的:
PROJECT_BINARY_DIR #执行cmake的位置,例如2中所说的build目录
PROJECT_SOURCE_DIR #CMakeLists.txt存放的位置
EXECUTABLE_OUTPUT_PATH #生成可执行文件的存放目录
LIBRARY_OUTPUT_PATH #生成依赖包的存放目录
CMAKE_CXX_STANDARD #C++标准,例如c++14则把其set为14即可,等价于-std=c++14
CMAKE_CXX_FLAGS #G++编译选项,对应Makefile里的CFLAGS
2)常用命令
cmake_minimum_required (VERSION <version>) #cmake运行环境的最低要求
project (<project_name>) #声明项目名称
set(<variable> <value>) #经常使用的命令,等价于C++的#define
execute_process (COMMAND <command>) #执行shell命令
add_definitions(-DFOO=<definition>) #等价于G++的-D编译选项
message ([STATUS] "<message>") #打印message,STATUS选项会多打印---提示
include_directories ([dir1] [dir2]) #头文件目录
link_directories ([dir1] [dir2]) #链接的库文件的目录
aux_source_directory (<dir> <var>) #寻找dir目录下的所有c++/c源文件,并存放在var变量中
find_program (<var> prog_name [DOC "<doc>"]) #寻找可执行程序,并赋给变量var,DOC可以打提示语句
find_file (<var> file_name [DOC "<doc>"]) #寻找文件,并赋给变量var,DOC可以打提示语句
option ((<var> ["tips"] [ON | OFF]) #给var赋值true/false,有初始值。
#可在ccmake中开启或cmake时添加选项
add_library (<name> #生成链接库文件
[STATIC | SHARED | MODULE] <SRC>)
add_subdirectory (<dir> <lib_dir>) #添加子目录,该目录下也必须有CMakeLists.txt,同时也可以指定执行cmake的目录
add_executable (<exe_name> <SRC>) #用SRC编译生成可执行文件name,
target_link_libraries (<exe_name> <LIB>) #链接依赖库
----条件语句命令----
if (expression)
# then section.
elseif (expression2)
# elseif section.
else(expression) #此处expression可以省略
# else section.
endif(expression) #此处expression可以省略
----文件搜索命令---- #file命令有很多用法,这里只记录我用到的两个
file (GLOB <var> <path>) #寻找当前目录下的所有包含某些特征的文件
file (GLOB_RECURSE <var> <path>) #递归寻找当前目录下的所有包含某些特征的文件
例如:
file (GLOB ALL_SRC #寻找src目录的全部以cpp为后缀的文件
${PROJECT_SOURCE_DIR}/src/*.cpp
)
3)常见编写过程实例
1.初始化
cmake_minimum_required (VERSION xx) #指定cmake运行环境的最低版本
project (xx) #声明工程名字
set (EXECUTABLE_OUTPUT_PATH path) #指定生成可执行文件目录
set (LIBRARY_OUTPUT_PATH path) #指定生成lib依赖库目录
set (CMAKE_CXX_STANDARD 14) #指定C++版本
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") #添加G++编译选项
2.搜寻源文件
set (ALL_SRC path1/a.cpp path2/b.cpp) #明确指定源文件
aux_source_directory (path ALL_SRC) #搜索path目录下的源文件
file (GLOB ALL_SRC path/*.cpp) #搜索path目录下的.cpp文件
3.指定头文件目录及依赖库目录
include_directories (path1 path2) #指定头文件目录
link_directories (path1 path2) #指定依赖库目录
4.生成目标文件
set (EXECUTABLE XXX) #命名目标文件为xxx
add_executable (${EXECUTABLE} ${ALL_SRC}) #生成目标文件
5.链接
arget_link_libraries (${EXECUTABLE} ${EXTRA_LIBS})
#链接依赖库,注意所有依赖库必须在link_directories的目录下
5.运行
mkdir build #创建build目录
cd build #打开build目录
cmake .. #执行cmake,生成Makefile
make -j8 #执行Makefile进行编译,-j8表示8核并行