侧边栏壁纸
博主头像
LittleAO的学习小站 博主等级

在知识的沙漠寻找绿洲

  • 累计撰写 125 篇文章
  • 累计创建 27 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

CMake使用指北

LittleAO
2024-07-04 / 0 评论 / 0 点赞 / 20 阅读 / 0 字
温馨提示:
本文最后更新于2024-07-21,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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,可见我的这篇文章:

https://bg.littleao.top/archives/computer_graphics_install_opengl

如果你的库已经安装成功,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 ,指定文件的路径,这样你的项目中的每个文件就会被自动分析,在错误提示和代码补全中十分有用。

0

评论区