一、cmake、make的本质是编译选项的组织集合

本质上来说,makecmake都是协助你进行编译的工具,用户完全可以通过g++ gcc按照编译器要求来进行直接编译,只不过makecmake根据各自认为合适的组织规则方便我们进行编译管理罢了。

如增加一个线程库:

g++ *.cpp -o -lpthread test

这是g++编译器要求的样子。所有包含头文件、库文件、打包和链接库等操作都通过-选项来完成。

make为了减少和整合编译逻辑,将一些例如打包ar操作封装在一个变量AR中;一些编译器专用的选项CXXFLAGSCPPFLAGS;有不同编译器和连接器变量名CCLD,总而言之,把一些选项按照一定的组织规则,放在一个变量,然后设计者通过这些分号类的变量,按照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)