1.基础概念
- CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)
- CMake可以说已成为大部分c++开源项目标配
2.语法特性介绍
-
基本语法格式:指令(参数1 参数2 …)
参数使用括弧括起来
参数之间使用空格或分号分开
-
指令是大小写无关,参数和变量是大小写相关的
set(HELLO hello.cpp)
add_executable(hello main.cpp hello.cpp)
ADD_EXECUTABLE(hello main.cpp ${HELLO})
- 变量使用 方式取值,但是在 I F 控制语句中是直接使用变量名,如 i f ( {}方式取值,但是在IF控制语句中是直接使用变量名,如if( 方式取值,但是在IF控制语句中是直接使用变量名,如if({hello}) 错误的 应该是 if(hello)
3.CMake重要指令
-
cmake_minimum_required ----- 指定CMake的最小版本要求
语法:cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
#CMake 最小版本要求为2.8.3
cmake_minimum_required(VERSION 2.8.3)
-
project ------- 定义工程名称,并可指定工程支持的语言
语法:project(projectname [cxx] [c] [java])
#指定工程名为 HELLOWORLD project(HELLOWORLD)
-
set ------ 显示的定义变量
语法:set(VAR[][][VALUE] [CACHE TYPE DOCSTRING] [FORCE])
#定义src变量 其值为sayhello.cpp hello.cpp set(SRC sayhello.cpp hello.cpp) #意思是 src代表上面两个cpp文件
-
include_directories ----- 向工程添加多个特定的头文件搜索路径------相当于指定g++编译器的-l参数
语法:include_directories([AFTER|BEFORE] [SYSTEM] dirr1 dir2…)
#将 /user/include/myincludefolder 和 ./include 添加到头文件搜索路径 include_directories(/user/include/myincludefolder ./include)
-
link_directories ----- 向工程添加多个特定的库文件搜索路径 — 相当于g++编译器-L参数
语法:link_directories(dir1 dir2 …)
#将 /user/include/myincludefolder 和 ./include 添加到库文件搜索路径 link_directories(/user/include/myincludefolder ./include)
-
add_library ---- 生成库文件
语法:add_library(libname [SHARED(动态库)|STATIC(静态库)|MODULE] [EXCLUDE_FROM_ALL] source1 source2…)
#通过变量SRC生成libhello.so共享库
add_library(hello SHARED ${SRC})
-
add_compile_options----添加参数
语法:add_compile_options(…)
#添加编译参数 -wall -std = c++11 -o2 add_compile_options(-wall -std = c++11 -o2)
-
add_executable ------生成可执行文件
语法:add_executable (exname source1 source2…)
#编译main.cpp生成可执行文件 main add_executable(main main.cpp)
-
target_link_libraries — 为target添加需要连接的共享库----相当于指定g++编译器-l参数
语法:target_link_libraries (target library1<debug|optimized> library2…)
#将hello动态库文件链接到可执行文件main target_link_libraries(main hello)
-
add_subdirectory ---- 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
语法:add_subdirectory (source_dir[binary_dir] [EXCLUDE_FROM_ALL])
#添加src子目录,src中需要有一个CMakeLists.txt add_subdirectory (src)
-
aux_source_directory ----发现一个目录下所有的源代码文件并将文件列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
语法:aux_source_directory (dir VARIABLE)
#定义SRC变量,其值为当前目录下所有的源代码文件 aux_source_directory(. SRC) #编译SRC变量所代表的的源代码文件,生成main可执行文件 add_executable(main ${SRC})
4.CMake编译工程
CMake目录结构:项目主目录存在一个CMakeLists.txt文件
两种方式设置编译规则:
- 包含源文件的子文件夹包含CMake.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录
- 包含源文件的子文件夹未包含CMake.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中
4.1编译流程
在Linux平台下使用CMake构建C/C++工程的流程如下:
- 手动编写CMakeLists.txt
- 执行命令cmake PATH生成MakeFile(PATH 是顶层CMakelists.txt所在的目录)
- 执行命令make进行编译
小细节
#important tips
. #表示当前目录
./ #表示当前目录
.. #表示上级目录
../ #表示上级目录
4.2两种构建方式
- 内部构建(in-source build):不推荐使用
##内部构建
#在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件
cmake .
#执行make命令 生成target
make
- 外部构建(out-of-source build):推荐使用
将编译输出文件与源文件放到不同目录中
##外部构建
#1.在当前目录下创建build文件夹
mkdir build
#2.进入到build文件夹
cd build
#3.编译上级目录的CMmakeListis.txt 生成Makefile和其他文件
camke ..
#4.执行make命令 生成target
make