[CMake翻译]如何设置CMake for C++ (Windows)

475 阅读6分钟

原文地址: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(免费版)翻译