CMake的一些基础写法

于 2020-05-27 发布 , 于 2023-09-16 更新

不要想着骚操作。基本参考维基教科书:CMake入门。然而因为这个教科书已经停止更新了,所以参考CMake官方网站的教程CMake Tutorial

最简单的编译一个源文件的CMakeLists.txt

天才第一步,“Hello world”。写一个输出hello world的main.cc (这里用的是谷歌代码规范的命名规则)。然后同目录放一个包含以下内容的CMakeLists.txt:

1
2
3
4
5
6
7
# 指示要求的cmake最低版本
cmake_minimum_required (VERSION 2.6)

# project名字
project(helloworld)
# 新增target,类型为可执行文件,输出文件名helloworld,源代码文件main.cc
add_executable(helloworld main.cc)
./
`-- CMakeLists.txt 
`-- main.cc

在这个目录下 cmake .,cmake就会输出一个包含makefile的build文件夹,在build文件夹里make,就会输出可执行文件helloworld。这种叫做In-source build(虽然实际上已经有点out-source的感觉了)。

不建议直接 cmake .,这样会导致与源代码无关的编译文件污染源代码目录。无论什么时候都应该新建目录用于编译。

Out-Source Build

为了不污染源代码,应该新建build目录再编译。

./
|-- build
`-- CMakeLists.txt
`-- main.cc
1
2
cd build
cmake ../

这样就把cmake生成的编译文件和源代码分开了。启动编译就是在build目录里执行cmake --build .

或许只是因为某个library只有头文件,没有cpp,所以cmake不知道到底是什么语言。然而实际上就算手动设置link language,由于不是把这个library设置为interface library(或者什么其他东西),所以linker一样不会生成lib,导致链接失败。摸鱼的解决办法:新建一个空的cpp文件,就只有一行,#include这个头文件,就完事了。

总的来说是因为编译单元的问题,解决办法就是为每个header都创建对应的source文件(.c.cpp),然后在source文件中#includeheader。

目录