C++写项目,构建工具必不可少。如何将C++的开源库引入到项目中,如何更好地管理各种文件,如何只写一份代码实现不同平台的编译,这些都可以使用CMake解决。
创建一个空文件夹,创建新的main.cpp文件,开始编写CMake吧。
必备段
在根目录下创建CMakeList.txt,如果使用的文本编辑工具为Visual Studio Code,可以按照CMake tools插件。
文件中需要填写以下内容:
# 指定要求的 CMake 最低版本
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(HelloWorld)
# 添加可执行文件并指定源文件
add_executable(Example main.cpp)以上三条语句是每个CMakeList.txt都要出现的。
cmake_minimum_required不必多说,用于指定CMake编译的最小版本。
project为你的项目命名,每一个项目都需要一个自己的名字。
add_executable生成一个可执行文件,例如Windows平台就是.exe。了;例如上例,可执行文件的名字就是MyExecutable,程序入口为程序名字后所跟源代码的main函数。
开始构建
通常情况下,我们不想要构建的文件分散在父目录下,因此我们可以在新建一个子目录build,并用命令行打开build文件夹。输出以下命令:
cmake .... 就是上级目录,CMake会自动寻找该目录下的CMakeLists.txt,根据里面的信息进行生成构建所需的文件,我们看看都有哪些文件。

CMake会根据你系统中存在的构建系统来生成对应的构建文件,例如我使用的是ninja。如果你用的是make进行构建,那么build.ninja可能会是Makefile。
根据构建系统的不同,接下来构建需要的命令也不同了:
如果build中是
build.ninja,你需要在该目录下命令行输入ninja来构建执行文件。如果build中是
Makefile,在该目录下命令行输入make来构建执行文件。
如果你的程序没有发生错误,紧接着你就能在build中看到可执行文件的影子了,打开它,你就能看到你所写代码的样子了。

多源代码构建
只有一个主函数
我们写项目的时候,并不会把代码只写到一个文件里。通常,我们会新建一个src文件夹,把源代码放进去。这样做只有我们知道,编译工具可不知道你把代码写在了别处。
在add_executable名字的后面跟上你所有写过的源代码,这样编译工具就知道了,是不是很简单:
add_executable(Example main.cpp src/func.h src/func.cpp)我们可以在设置一个变量,存储所有的源代码信息,然后在add_executable直接应用这个变量。类似于这样:
set(SRC_FILES "main.cpp" "src/func.h" "src/func.cpp")
add_executable(Example ${SRC_FILES})如果说我们不想思考那么多,让工作文件夹中的所有源代码都加入进来,可以用以下命令:
# set(SRC_FILES "main.cpp" "src/func.h" "src/func.cpp")
aux_source_directory(./src SRC_FILES)
add_executable(Example main.cpp ${SRC_FILES})aux_source_directory(./src SRC_FILES) 会将所有src目录下可能的源文件作为变量存在SRC_FILES 中,不用我们一个一个去添加了。
注意到我们的main 函数在引用src中头文件,需要加入src/ 的标识,如果我们需要include路径搜索包括这个文件夹,只需要以下语句:
include_directories(./src)编译时就会自动把该文件夹下的头文件加入include列表了。
多主函数
src新建一个文件,再加入一个主函数,看看构建会发生什么?
这时候会报错multiple definition of `main' ,意味着我们定义了多个main函数。通常我们需要为多个main函数创建不同的可执行文件,尝试修改CMakeLists.txt文件。
add_executable(Example main.cpp ${SRC_FILES})
add_executable(SecondFile hello_earth.cpp ${SRC_FILES})将刚刚创建的源文件移动到父目录下,然后构建,发现构建出了两个可执行文件。
导入库
以LearnOpenGL中的这篇文章为例,这篇文章需要我们导入两个开源库,分别是GLFW库和GLAD库。如何编译这两个库我们不讲,最简单的方法是使用vcpkg,可见我的这篇文章:
如果你的库已经安装成功,CMake链接这些库只需如下步骤:
find_package(SomeLibrary REQUIRED)
include_directories(${SomeLibrary_INCLUDE_DIRS})
target_link_libraries(MyExecutable PUBLIC ${SomeLibrary_LIBRARIES})
不同库的的链接方式有差异,如果想要导入一个库,可以从搜索引擎搜索它的导入方式。
以glfw3为例,导入库需要以下命令:
# glfw
find_package(glfw3 REQUIRED)
add_executable(Example main.cpp ${SRC_FILES})
# glfw库连接到可执行文件
target_link_libraries(Example glfw3)Visual Studio Code中CMake的使用
Visual Studio Code搭配CMake tools插件和C++插件能够实现智能补全。
下载安装好CMake tools后按住Ctrl+Shift+P打开命令菜单,搜索CMake配置,能够智能识别你的CMakeList.txt然后进行配置,之后每次保存这个文件,构建文件都会重新生成,不仅如此,它还会额外生成一个compile_commands.json 文件,用于描述每个源文件在项目中的编译命令。这个文件对于基于编译器的工具(如代码编辑器、静态分析工具等)非常有用,因为它提供了编译器如何编译每个源文件的详细信息。
通过这个文件可以实现代码的自动分析和补全。在VScode的设置中搜索compile_commands ,指定文件的路径,这样你的项目中的每个文件就会被自动分析,在错误提示和代码补全中十分有用。
评论区