CMake学习笔记


[TOC]

指令是大小写无关的,参数是大小写相关的。

变量

CMake变量使用 ${ }方式取值,但是在IF控制语句中是直接使用变量名。

环境变量使用 $ENV{ }方式取值,使用SET(ENV{VAR} VALUE)赋值。

指令(参数1 参数2)

ADD_EXECUTABLE指令

ADD_EXECUTABLE(hello main.c func.c)

或者

ADD_EXECUTABLE(hello main.c; func.c)

常见命令解析

  • cmake_minimum_required(VERSION 2.6)命令

规定cmake软件的最低版本,这行命令是可写可不写的。

  • project()命令

语法:

project(projectname [cxx][c][java])

可以指定工程采用的语言,选项分别表示:C++,C,java,如不指定默认支持所有语言。

指定项目的名称,在生成VS项目下即指明了生成的.sln项目的文件名。项目最终编译生成的可执行文件不一定是这个项目名称,而是由另一条命令(add_executable)指定的。

project命令定义了解决方案的名称

add_executable

add_library

命令会生成一个项目。

cmake有两个预定义的变量:

<projectname>_BINARY_DIR

<projectname>_SOURCE_DIR

即一旦使用了project指明了一个项目名称,则同时隐式定义了这两个预定义的变量。

在内部编译情况下,这两个变量的含义相同。

而在外部编译下,两者指代的内容会有所不同。要理解这两个变量的含义 ,我们首先需要了解什么是外部构建。

同时cmake还预定义了

PROJECT_BINARY_DIR

PROJECT_SOURCE_DIR

变量,

其中

PROJECT_BINARY_DIR

就等同于

<projectname>_BINARY_DIR
PROJECT_SOURCE_DIR

等同于

<projectname>_SOURCE_DIR

因此在实际应用中,强烈推荐使用

PROJECT_BINARY_DIR

指向的是<项目目录>/build 目录

PROJECT_SOUECE_DIR

指向的目录同内部构建一样,仍然是项目目录

变量。

外部构建的含义

外部构建和内部构建最大的不同在于执行cmake的工作路径不同,在我们使用cmake构建项目时,首先要求制定“where is

the source code”,然后要求指定”where to build the binaries。”此时如果这两个路径相同的话,cmake生成的所有中间文件和可执行文件都会存放在项目目录(即所谓的根目录)中。而如果我们在项目目录下先新建一个build文件夹,然后将“Where to build the binaries”指定为该build文件夹的路径,此时中间文件和可执行文件都会存放在build目录下,第二种方法的优点显而易见,它最大限度的保持了代码目录的整洁,同时由于第二种方法的生成、编译和安装时发生在不同于项目目录的其他目录中,所以第二种方法就叫做“外部构建”。

ADD_SUBDIRECTORY命令

语法:

ADD_SUBDIRECTORY(source_dir[binary_dir][EXCLUDE_FROM_ALL])

该命令告诉CMake去子目录查看可用的CMakeLists.txt文件。

指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。

EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除。比如,工程的example,可能就需要工程构建完成后,再进入example目录单独进行构建。

在我们的项目中, 我们添加了src目录到项目中,而把对应src目录生成的中间文件和目标文件存放到bin目录下,在上一节举例中“外部构建”的情况下,中间文件和目标文件将存放在build/scrobj目录下

ADD_EXECUTABLE命令

告诉工程生成一个可执行文件。该命令定义了工程最终生成的可执行文件的文件名以及参与编译的头文件和cpp文件。

如果想指定生成的可执行文件的存放路径,可以设置cmake中预定义变量EXECUTABLE_OUTPUT_PATH的值。例如,将生产的可执行文件放置在cmake编译路径的bin文件夹下可用:

SET(EXECUTABLE_OUTPUT_PATH${PROJECT_BINARY_DIR}/bin)

ADD_LIBRARY命令

ADD_LIBRARY(libname[SHARED|STATIC])

告诉工程生成一个库文件

FIND_LIBRARY命令

查找库所在目录

FIND_LIBRARY(RUNTIME_LIB rt /usr/lib  /usr/local/lib NO_DEFAULT_PATH)

cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB就会被赋为NO_DEFAULT_PATH

SET命令

用于设置变量,相当于为变量取别名。

SET(CMAKE_BUILE_TYPE DEBUG)

设置编译类型debug或者release。debug版会产生相关调试信息,可以使用GDB进行调试;release不会生成调试信息。当无法进行调试时查看此处是否设置为debug。

SET(CMAKE_C_FLAGS_DEBUG"-g -Wall")#设置编译器的类型
CMAKE_C_FLAGS_DEBUG  #c编译器
CMAKE_CXX_FLAGS_DEBUG #C++编译器

文章作者: Raina Jung
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Raina Jung !
  目录