当前位置: 代码迷 >> 综合 >> CMakeLists.txt语法记录
  详细解决方案

CMakeLists.txt语法记录

热度:119   发布时间:2023-11-17 02:34:27.0

一:前言

实际上没什么前言,但是总感觉上来就讲指令有点尴尬。随便说点什么。
参考博客 感谢原作者的辛勤付出,写的非常好。

二:具体指令

1、PROJECT


语法: PROJECT(projectname [CXX] [C] [Java]
指令功能: 定义工程名称,指定工程支持的语言
例子: PROJECT (HELLO)
说明:
1. 一般支持语言列表会省略
2. 这里指定的是工程名,和生成的可执行文件的名不一定要一样的,二者没什么关系。
3. 该指令隐式的定义了两个cmake变量:projectname_BINARY_DIR 以及projectname_SOURCE_DIR,例子就是 HELLO_BINARY_DIR 和HELLO_SOURCE_DIR,分别表示构建路径和项目路径。这两个值和CMake的预定义变量PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR值是一样的,建议使用后者。

2、SET


语法: SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
指令功能: 用来显式的定义变量
例子: SET (SRC_LST main.c other.c)
说明: 用变量代替值,例子中定义SRC_LST代替后面的字符串。

3、MESSAGE


语法: MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display”…)
指令功能: 输出信息
例子: MESSAGE (STATUS “The binary dir is ${PROJECT_BINARY_DIR}”)
说明: 输出信息的类型解释:
1. SEND_ERROR:产生错误,跳过。
2. SATUS:输出以-为前缀的提示信息。
3. FATAL_ERROR:立即终止所有cmake过程。

4、ADD_EXECUTABLE


语法: ADD_EXECUTABLE(可执行文件名 依赖的文件列表)
指令功能: 制定生成的可执行文件的名和源文件列表
例子: ADD_EXECUTABLE(hello ${SRC_LIST})
说明: 变量的用法,除了在IF语句里,当要用变量的值时候,就要像例子中一样使用。

5、ADD_SUBDIRECTORY


语法: ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
指令功能: 用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除。
例子: ADD_SUBDIRECTORY(src bin)
说明: 例子中将src子目录加入工程,把可执行文件生成在执行cmake ..的目录的bin目录下,如果不加bin参数,则放在执行cmake ..的目录的src目录下,并且与src的文件名对应。

三:其他问题解析

问题1:cmake的基本语法规则是什么?


1) 变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
2) 指令(参数1 参数2…)
参数使用括弧括起,参数之间使用空格或分号分开。
例如:SET (SRC_LST main.c other.c)
也可以写成 SET (SRC_LST main.c;other.c)
3) 指令是大小写无关的,参数和变量是大小写相关的。(推荐你全部使用大写指令。)

问题2:怎样清理构建目录?支不支持make distclean?


1) 清理用make clean
2) 不支持make distclean

问题3:什么是内部构建(in-source build)和外部构建(out-of-source build)?


1) 内部构建就是在项目源文件夹下进行构建。这时候PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR是相同的。
这种就属于内部构建,内部构建之所以不被提倡,是因为,在构建过程中产生的好多中间文件,
例如: CMakeCache.txt等都不能通过make clean进行删除, 并且cmake又不支持make distclean, 这样构建一次,就让整个源文件的目录树很乱,看着就不爽,怎样解决这个问题那?用外部构建!

2)外部构建简单说就是再新建一个文件夹,然后在文件夹里执行 cmake srcpath.
例如:上面的例子中,我们再建立一个build文件夹(当然也可以是其他名字),然后进入build文件夹,执行cmake .. 。
执行外部构建的时候这个时候PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR就不相同了。
在本例中PROJECT_SOURCE_DIR=/home/linuxxiaoniu/
而PROJECT_BINARY_DIR=/home/linuxxiaoniu/build