首页 > 解决方案 > 如何在 CMake 中为 Visual Studio 生成器添加预编译头文件

问题描述

CMake 3.18;对比 2019;

我正在学习 CMake 并检查我的结果,我正在尝试生成 Visual Studio 项目。我当前的问题是预编译头选项。我想要实现的是 VS 项目将具有正确文件名的“/use”或“/create”预编译头选项。

在我的项目文件夹中,我已经有 ugpch.h 和 ugpch.cpp 文件,它们代表预编译的头文件。我已经尝试target_precompile_headers(UGame PRIVATE Source/ugpch.h)在我的 cmakelists 中使用指令,但这对我的 Visual Studio 预编译头选项没有影响。这样做的正确方法是什么?

编辑:我已将我的 cmake 更新到 3.18 版本,但在我生成的 Visual Studio 项目中仍然没有我预期的效果。相反,我找到了带有 cmake_pch.cxx 文件的新文件夹“预编译头文件”。它看起来与target_precompile_headers我预期的完全不同

标签: c++cmake

解决方案


该命令target_precompile_headers已在 CMake 3.16 中添加。

你要么必须升级你的 CMake 发行版(VS2019 中的发行版是最新的),要么从安装程序中安装最新的。

否则,您将不得不使用 cotire 作为预编译头文件,但我的建议是升级,因为它通常很容易做到,而且您的计算机上可能已经有了 Visual Studio 附带的最新版本。


既然你更新了你的问题。

该命令target_precompile_headers没有按照您的想法执行。你不在那里提供你的 PCH,你提供什么标题应该是生成的 PCH 的一部分。如果文件ugpch.h包含包含 for和headera.h,那么您的预编译头命令应该如下所示:headerb.hheaderc.h

target_precompile_headers(UGame PRIVATE headera.h headerb.h headerc.h)

实际的预编译头文件将由 CMake 生成。

当然,你仍然可以使用ugpch.h你的预编译头文件。CMake 将简单地使用它来生成自己的。正如你所观察到的。

之后,删除标题的手动包含。它将自动包含在内。

从 CMake 文档中:

头文件列表用于生成名为 cmake_pch.h|xx 的头文件,用于生成预编译的头文件(.pch、.gch、.pchi)工件。cmake_pch.h|xx 头文件将被强制包含(-include 用于 GCC,/FI 用于 MSVC)到所有源文件,因此源不需要具有#include "pch.h"。

为什么它会像你问的那样工作?CMake 支持PUBLIC预编译头文件。如果您链接到多个目标,每个目标都具有公共预编译标头,那么您的目标将继承所有这些标头。由于编译器通常接受一个预编译的标头,因此 CMake 必须生成聚集的标头才能使其正常工作。


推荐阅读