cmake学习笔记

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定义生成相关源文件

基本语法规则

  1. 变量使用${}取值,IF语句中无需
  2. 指令(参数1 参数2 ...),多个参数用空格或分号分开
  3. 指令大小写无关,参数变量大小写相关。推荐指令使用大写

一些疑惑

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.cmain.cpp
当然最好不要偷这点懒,万一你真的有个叫main的文件肯定会让你对生成时的错误焦头烂额

清理工作

cmake的清理工作非常简单

make clean

内部构建与外部构建

关于内部构建,本篇以上的内容都是内部构建,相信目录中生成一堆中间文件肯定让人感到烦杂,但能够使用外部构建,是我们跳出杂乱的文件夹

外部构建的过程

  1. 创建一个build目录(顾名思义的名字比较清晰,但用别的也可以)
  2. 进入build目录,运行cmake <project directory>
  3. 运行make构建工程

上述便是在Linux环境下的cmake外部构建,最大的好处就是不会弄乱源文件目录,中间文件与源文件混在一起可谓是相当糟糕的

原文地址:https://www.cnblogs.com/chilono/p/8735622.html