一、cmake、make的本质是编译选项的组织集合
本质上来说,make
和cmake
都是协助你进行编译的工具,用户完全可以通过g++
gcc
按照编译器要求来进行直接编译,只不过make
和cmake
根据各自认为合适的组织规则方便我们进行编译管理罢了。
如增加一个线程库:
g++ *.cpp -o -lpthread test
这是g++
编译器要求的样子。所有包含头文件、库文件、打包和链接库等操作都通过-选项
来完成。
make
为了减少和整合编译逻辑,将一些例如打包ar
操作封装在一个变量AR
中;一些编译器专用的选项CXXFLAGS
和CPPFLAGS
;有不同编译器和连接器变量名CC
和LD
,总而言之,把一些选项按照一定的组织规则,放在一个变量,然后设计者通过这些分号类的变量,按照g++
组织规则帮助用户完成编译。
cmake
也是一样,出发点都是组织编译规则,让用户更为简单地进行程序编译。
二、cmake增加编译选项
2.1、变量的定义和使用
定义和作为参数时,变量名本身;使用内容时加上${}
- 定义变量
SET(OBJ_NAME xxxx)
,使用时${OBJ_NAME}
- 参数,则直接使用名字。如:
aux_source_directory(./src DIR_SRC)
2.1、变量的种类
CMake共用七种变量,如下所示:
- 提供信息的变量;
- 控制变量;
- 描述系统的变量;
- 控制构建过程的变量;
- 语言变量;
- CTest变量;
- CPack变量。
cmake
常见的变量(即选项):
- CMAKE_SOURCE_DIR
- CMAKE_CXX_FLAGS
- CMAKE_C_FLAGS
- CMAKE_CXX_STANDARD
三、cmake增加常见选项
常见的选项主要是CXX的标准,或者CXX的标志。
- 设置
CMAKE_CXX_STANDARD
变量增加c++11标准:set(CMAKE_CXX_STANDARD 11)
- 设置
CMAKE_CXX_FLAGS
变量增加pthread支持:set(CMAKE_CXX_FLAGS -pthread)
- 设置
CMAKE_CXX_FLAGS
为多个选项:set(CMAKE_CXX_FLAGS "-pthread -g -Wall")
- 设置
CMAKE_CXX_FLAGS
变量让程序先找当前目录:set(CMAKE_CXX_FLAGS "-Wl,-rpath=.")
四、CMake添加预处理选项
对于C/C++语言,编译器预处理命令主要有:
- 文件包含
- 宏定义
- 条件编译
- 特殊控制(#progma)
我们可以选择在代码中写这些预处理命令,也可以直接在命令行向编译器传递。编译器在处理时需要添加一个额外的-D
或者\D
,代码中具体使用方法见[2]。
CMake使用add_definitions
向编译器传递一个编译选项,它可以是编译器任何一个命令,但其初衷是为了增加一个预处理定义。
注意!add_definitions
添加的内容是一个非常宽泛的东西,新版本已经被取代(superseded),更加细化的描述了编译选项:
-
add_compile_definitions()
预处理(宏定义变量),多个直接用空格隔开 -
include_directories()
头文件 -
add_compile_option()
其他
PS:set
某个变量也可以间接设置预处理命令。
综上,如果你需要增加一个编译选项,按选项的性质选择上述三个即可,直接使用add_definitions
因为“粒度太大”而不再被推荐使用。多个
例子:
利用BUILD_ALL宏定义条件编译代码:
int main()
{
#ifdef BUILD_DLL
printf("Hellodd");
#endif
return 0;
}
在CMakelists.txt下增加以下语句:
add_compile_definitions(BUILD_DLL)
注意,不用写额外的-D
.
add_compile_definitions(BUILD_DLL)