第二例:单文件项目——从零搭建你的第一个CMake工程

说实话,很多初学者第一次接触CMake时,都会被那些复杂的脚本吓到。但我想告诉你,CMake其实没那么玄乎。咱们就从最简单的场景开始——只有一个.cpp文件的项目。

我记得刚带团队时,有个新人把CMakeLists.txt写得跟天书似的,各种变量、函数满天飞。我一看,项目就一个main.cpp。嗯,这完全没必要。今天我们就来聊聊,单文件项目该怎么写CMakeLists.txt。

最简CMakeLists.txt长什么样?

先看代码,再说原理:

cmake_minimum_required(VERSION 3.10)
project(HelloWorld)
add_executable(hello main.cpp)

就三行。你没看错,三行就够了。我刚开始用CMake时,总觉得这么简单是不是漏了什么。后来发现,对于单文件项目,这三行就是标准答案。

逐行拆解

第一行:cmake_minimum_required

这行指定了CMake的最低版本。为什么要写?因为不同版本的CMake,语法和行为可能有差异。我个人习惯写3.10,这个版本支持了绝大多数现代CMake特性,兼容性也好。

避坑指南:我曾经在一个老服务器上编译项目,CMake版本只有2.8。结果modern CMake的target_include_directories根本用不了。所以,版本号别写太高,也别写太低。3.10是个稳妥的选择。

第二行:project

给项目起个名字。这里我写了HelloWorld。这个名字会影响后续的一些变量,比如PROJECT_NAME、PROJECT_SOURCE_DIR等。说白了,就是给你的工程一个身份标识。

第三行:add_executable

这行是核心。它告诉CMake:我要生成一个可执行文件,名字叫hello,源文件是main.cpp。你想想看,这不就是gcc -o hello main.cpp的CMake版本吗?

完整的构建流程

有了CMakeLists.txt,怎么用?我建议你养成一个好习惯——out-of-source构建。也就是在项目根目录下创建一个build文件夹,在里面执行cmake命令。

mkdir build
cd build
cmake ..
make

为什么非要建个build目录?直接cmake .不行吗?行,但不推荐。因为cmake会在源码目录生成一堆中间文件(CMakeCache.txt、CMakeFiles/等),把源码目录搞得乱七八糟。我见过太多人直接在源码目录cmake,然后git status时看到一堆未跟踪文件,一脸懵。

小技巧:如果你不小心在源码目录执行了cmake,别慌。删掉所有CMake开头的文件和目录就行。或者直接git clean -fd(小心使用,会删除所有未跟踪文件)。

知识体系一览

为了让你更直观地理解单文件项目的CMake结构,我画了张图:

单文件CMake项目结构 main.cpp 你的C++源代码 CMakeLists.txt 构建配置文件 build/ 构建输出目录 读取 生成 hello 可执行文件 编译链接 CMakeLists.txt 三要素 ① cmake_minimum_required ② project ③ add_executable

从图中可以看到,整个流程非常清晰:CMakeLists.txt读取main.cpp,在build目录生成构建系统,最终编译出hello可执行文件。而CMakeLists.txt本身,只需要三个核心指令。

常见问题与避坑

Q:源文件名字必须叫main.cpp吗?

当然不是。你叫app.cpp、test.cpp都行。只要add_executable里写的名字和实际文件名一致就行。我习惯把入口文件叫main.cpp,这是C++社区的约定俗成。

Q:可执行文件名字可以随便起吗?

可以。但注意不要和系统命令重名。比如你起名叫test,那在终端执行./test时,可能会和系统的test命令混淆。我个人习惯用项目名的小写形式。

Q:cmake命令执行后,生成了好多文件,哪些是需要的?

只需要保留CMakeLists.txt和main.cpp。build目录可以随时删除重建。这也是out-of-source构建的好处——源码目录干干净净。

核心要点总结

  • 单文件项目只需要三行CMakeLists.txt
  • 始终使用out-of-source构建(建build目录)
  • cmake_minimum_required建议写3.10
  • project名字影响后续变量
  • add_executable的第一个参数是目标名,第二个是源文件

好了,这就是单文件项目的全部内容。是不是比想象中简单?下一例我们会增加一个源文件,看看多文件项目该怎么组织。但今天,先把这三行吃透。你可以在自己的机器上试试,写个main.cpp,打印一句"Hello CMake",然后用我教的方法编译运行。相信我,亲手跑通一次,比看十遍教程都管用。


公众号:蓝海资料掘金营,微信deep3321