本质上来说,make和cmake都是协助你进行编译的工具,用户完全可以通过g++ gcc按照编译器要求来进行直接编译,只不过make和cmake根据各自认为合适的组织规则方便我们进行编译管理罢了。如增加一个线程库:
g++ *.cpp -o -lpthread test
这是g++编译器要求的样子。所有包含头文件、库文件、打包和链接库等操作都通过-选项来完成。
make为了减少和整合编译逻辑,将一些例如打包ar操作封装在一个变量AR中;一些编译器专用的选项CXXFLAGS和CPPFLAGS;有不同编译器和连接器变量名CC和LD,总而言之,把一些选项按照一定的组织规则,放在一个变量,然后设计者通过这些分号类的变量,按照g++组织规则帮助用户完成编译。
cmake也是一样,出发点都是组织编译规则,让用户更为简单地进行程序编译。
定义和作为参数时,变量名本身;使用内容时加上${}
- 定义变量
SET(OBJ_NAME xxxx),使用时${OBJ_NAME} - 参数,则直接使用名字。如:
aux_source_directory(./src DIR_SRC)
CMake共用七种变量,如下所示[1]:
- 提供信息的变量;
- 控制变量;
- 描述系统的变量;
- 控制构建过程的变量;
- 语言变量;
- CTest变量;
- CPack变量。
cmake常见的变量(即选项):
- CMAKE_SOURCE_DIR
- CMAKE_CXX_FLAGS
- CMAKE_C_FLAGS
- CMAKE_CXX_STANDARD
常见的选项主要是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=.")
对于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)
[1] https://www.cnblogs.com/liuzhenbo/p/11184608.html [2] https://www.cnblogs.com/LiuYanYGZ/p/5496006.html [3] https://blog.csdn.net/10km/article/details/51731959 [4] https://stackoverflow.com/questions/9017573/define-preprocessor-macro-through-cmake
【20220705】重写了“CMake添加预处理选项”小结
