cmake学习笔记
一些问题
- 除C/C++/JAVA外的语言不建议使用
- 已有非常完备构建体系不建议使用
- 若并不存在维护问题,没必要迁移至cmake
- 每个目录需要一个CMakeLists.txt
CMakeLists.txt 最基础结构
注:<>包含的为替换名
PROJECT (<project name>)
ADD_EXECUTABLE(<execute name> <source file name>)
示例:
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)
上方代码创建了一个名为"HELLO"的项目,生成可执行文件的名字定义为"hello",源文件输入只有一个"main.c"
指令说明
PROJECT
PROJECT(<projectname> [CXX] [C] [Java])
该语句可用于定义工程的名称
SET
SET(<variable name> [VALUE])
用于显示定义变量
MESSAGE
MESSAGE([STATUS | SEND_ERROR | FATAL_ERROR] <message content>)
用于输出自定义信息,不同类型对生成过程有影响:
- STATUS 输出前缀为-,对生成无影响
- SEND_ERROR 产生错误,跳过生成
- FATAL_ERROR 立即终止所有cmake过程
ADD_EXECUTABLE
ADD_EXECUTABLE(<execute name> <source file>)
execute name定义生成的可执行文件名字
source file定义生成相关源文件
基本语法规则
- 变量使用${}取值,IF语句中无需
- 指令(参数1 参数2 ...),多个参数用空格或分号分开
- 指令大小写无关,参数变量大小写相关。推荐指令使用大写
一些疑惑
cmake语法较为灵活
举个例子:
SET(SRC_LIST main.c)
可以写成SET(SRC_LIST "main.c")
两种写法没有区别,但若是文件名中包含空格,则必须使用第二种写法
例:
SET(SRC_LIST fo o.c) // 错误
SET(SRC_LIST "fo o.c") // 正确
若是使用第一种写法,cmake会认为参数是名为"fo"与"o.c"的两个文件,所以文件名尽量不要使用空格,使用下划线"_"作为连字符即可
cmake还可以自动匹配,例如main.cpp
文件,在参数中可只输入main
,cmake会自动在目录中查找main.c
或main.cpp
当然最好不要偷这点懒,万一你真的有个叫main
的文件肯定会让你对生成时的错误焦头烂额
清理工作
cmake的清理工作非常简单
make clean
内部构建与外部构建
关于内部构建,本篇以上的内容都是内部构建,相信目录中生成一堆中间文件肯定让人感到烦杂,但能够使用外部构建,是我们跳出杂乱的文件夹
外部构建的过程
- 创建一个build目录(顾名思义的名字比较清晰,但用别的也可以)
- 进入build目录,运行
cmake <project directory>
- 运行
make
构建工程
上述便是在Linux环境下的cmake外部构建,最大的好处就是不会弄乱源文件目录,中间文件与源文件混在一起可谓是相当糟糕的