不要想着骚操作。基本参考维基教科书: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 .
。
Cmake Cannot determine link language for target
或许只是因为某个library只有头文件,没有cpp,所以cmake不知道到底是什么语言。然而实际上就算手动设置link language,由于不是把这个library设置为interface library(或者什么其他东西),所以linker一样不会生成lib,导致链接失败。摸鱼的解决办法:新建一个空的cpp文件,就只有一行,#include
这个头文件,就完事了。
总的来说是因为编译单元的问题,解决办法就是为每个header都创建对应的source文件(.c
或.cpp
),然后在source文件中#include
header。