原文地址:thatonegamedev.com/cpp/how-to-…
原文作者:thatonegamedev.com/
发布时间:2021年01月13日
通过本教程,你需要做什么?
- 你需要有一些基本的C++知识,因为我不会解释为什么要编译这个应用程序,也不会解释我们要编译的应用程序做什么。从这篇解释C++基础知识的文章开始。
- 有一些正在执行的终端命令,但你不需要事先了解命令提示/PowerShell的知识。查看这篇关于如何操作命令行的文章。
- 安装了支持C++编译的Visual Studio。CMake会在以后自动检测你的Visual Studio安装情况。
为什么我们需要CMake?
C++是一门古老的语言。不要搞错了,它真的很强大,并且提供了很多对低级内存和系统编程的控制。不过作为一门古老的语言,它错过了一些现代高级语言的概念。当用C++编程时,由于没有统一的项目结构以及良好的包管理,很难针对多个平台。
在其他语言上,如Java、C#和python,代码总是被编译成一种中间语言,或者在运行时直接解释。然后,这些代码由一个特殊的虚拟机运行,将其翻译成特定机器的命令。
这就是CMake努力解决的问题,但却反其道而行之。它是一个项目生成器。在Windows上,人们会希望使用Visual Studio项目文件和解决方案,而在Linux上,人们更希望有Make文件。这本质上意味着,我们将我们的项目文件统一在CMake下,而CMake则为特定系统生成项目文件。
阅读更多的内容。你可以查看更多关于编译器和链接器的工作原理,以深入了解为什么这个过程与其他语言不同。
安装CMake
要安装cmake,你可以打开这个页面:cmake.org/download/。
你应该为你的windows安装找到相应的二进制文件(x64,x86)并下载.msi文件。它应该大致看起来像这样。
安装向导非常简单,只需确保在 "默认情况下,CMake不会将其目录添加到系统PATH "的问题上,你勾选了其中一个选项Add CMake to system Path,这样以后我们就可以在windows终端执行命令了。
创建我们的项目
我们将用一个最简单的例子来说明我们第一次使用CMake进行编译。我们将像往常一样从 "Hello, World!"应用程序开始,使用一个.cpp文件来演示CMake如何生成一个项目并编译该文件。
我们将有以下的项目结构。
root
├── src/
│ └── main.cpp
└── CMakeLists.txt
在我们的 "main.cpp "文件中,我们将写下下面的 "Hello, World!"应用程序。
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
"CMakeLists.txt "文件是我们使用CMake时的操作基础。它可以链接其他的CMakeLists文件,这将使我们很容易地包含依赖性(供应商)项目,并在我们的应用程序中编译它们。我们将从最基本的文件内容开始,这样我们就可以将 "main.cpp "编译成一个简单的控制台应用程序。
# This will set the minimum version of CMake required to generate the projects
# CMakeLists has its own language and features and as more and more versions are
# added it will include new keywords and options
cmake_minimum_required(VERSION 3.18)
# This will give our project a name
project(Main)
# This instructs CMake that we want to generate an executable file from this project
# Other options would be add_library but this is a topic for another time
# You can notice that we also pass on the path to our cpp file
add_executable(Main src/main.cpp)
如何生成构建文件
要开始生成cmake项目,我们需要在CMakeLists.txt文件所在的根目录下打开一个终端窗口。这可以通过点击文件夹内的shift+鼠标右键,然后选择 "Open PowerShell window here "来轻松完成。完成后,我们可以执行以下命令。
mkdir build
cd build
cmake ..
这将创建目录build,然后将终端工作目录移动到build,然后使用前一个目录中的 "CMakeLists.txt "文件生成项目,如cmake后面的两个点所指出的那样(单点表示当前目录,两个点表示向上一个目录)。
你也可以通过添加以下标志来指定源目录和构建目录。
cmake -B [build directory] -S [source directory]
执行此命令后,"build "文件夹将被项目文件填满。双击 "Main.sln "文件将打开Visual Studio。如果你一直跟进到现在,你将在解决方案资源管理器中拥有3个项目,如下所示。
- Main - 这是我们要构建的项目,它将生成我们的可执行文件。
- ALL_BUILD - 默认情况下,这将被设置为启动项目,它将运行Main和ZERO_CHECK。
- ZERO_CHECK - 因为我们的项目实际上并不是由visual studio控制的,而是从外部生成的,所以我们不能在visual studio内部添加源文件/头文件。要做到这一点,我们需要将它们添加到 "CMakeLists.txt "里面的add_executable命令中。ZERO_CHECK项目将监控该文件的变化,并根据变化重新生成VS项目。
现在我们已经打开了Visual Studio,我们可以建立项目了。使用快捷键ctrl + shift + b运行构建命令,或者点击顶部菜单 "构建"->"构建解决方案"。
注意:如果你还打开了命令行,你也可以使用命令
cmake --build . --config Debug
在Visual Studio解决方案资源管理器中右击 "主 "项目,选择 "设置为启动项目 "选项,即可运行该项目。在顶部的导航栏上,你会注意到一个带有 "本地Windows调试器 "标签的播放按钮,你可以点击它来运行你的项目(快捷键是ctrl+F5)。
注意:如果你已经使用命令行建立了项目,你可以使用以下命令运行我们刚刚编译的应用程序。
cd Debug .\Main.exe
增加更多的源文件
要添加其他文件到项目中,你需要使用Windows资源管理器在目标目录下创建它们,然后将它们添加到CMakeLists中。比如说,我们决定将 "#include <iostream>"和所有未来的包含文件移到另一个文件中。我们还想创建一个名为 "main.h "的头文件和另一个名为 "other.cpp "的C++文件,结果如下。
root
├── build/
│ └── Generated Build Files
├── src/
│ ├── main.h
│ ├── main.cpp
│ └── other.cpp
└── CMakeLists.txt
在src目录下创建一个名为main.h的文件,内容如下。
void print_hello_world();
然后我们修改main.cpp,将main.h代替<iostream>,并调用新定义的函数。这将导致以下文件。
#include "main.h"
int main() {
print_hello_world();
return 0;
}
让我们添加另一个文件来实现print_hello_world函数,并将其称为other.cpp。
#include <iostream>
void print_hello_world() {
std::cout << "Hello, World!" << std::endl;
}
在这一点上,visual studio将无法编译该项目,因为它将不知道其他.cpp。它将能够找到main.h文件。为了解决这个问题,我们需要打开CMakeLists.txt,并修改下面一行。
add_executable(Main src/main.cpp src/other.cpp src/main.h)
虽然不需要添加头文件,但列出所有的源文件是一个很好的做法,这样你也可以在以后的解决方案资源管理器中看到它们的列表。
现在你可以运行构建了。如果你想重新加载项目,Visual Studio会显示一个提示。确保点击 "Reload All"。
使用CMake GUI来构建
要使用可视化的CMake应用程序就更简单了。由于CMake已经安装在Windows上,你可以打开 "开始 "菜单,开始输入 "cmake"。选择 "CMake (cmake-gui) "作为搜索结果。
在你打开它之后,会出现一个窗口,你可以在这里输入一些选项来生成项目文件。首先你应该找到 "哪里是源代码 "输入栏,然后选择你的项目所在的文件夹(CMakeLists.txt文件的根目录)。然后你可以通过给 "在哪里构建二进制文件 "的值来选择一个目录,在那里生成项目。在我的例子中,我创建了一个单独的目录,但是你也可以把路径写到 "build "目录中。填好这两个字段后,你可以点击下面的 "Generate "按钮。它看起来应该是这样的。
项目生成后,你可以重复上述步骤,在新的目录 "build-gui "中附带的选项中点击CMake GUI窗口中的 "打开项目 "按钮。
使用Visual Studio 2017/2019
在最新版本的visual studio上,你可以用Visual Studio打开备选的根目录,它会检测到这是一个CMake类型的项目。用这种方式打开解决方案的好处是Visual Studio不会实际生成一个解决方案。它将使用另一个叫做 "Ninja "的构建系统,我将在另一篇文章中讲到。这个系统在重构上速度更快,这使得编译C++代码的效率更高。
通过www.DeepL.com/Translator(免费版)翻译