如何在CMake中为Visual Studio生成器添加预编译头

4

CMake 3.18; VS 2019;

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

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

编辑:我已经将我的CMake更新到3.18版本,但在生成的Visual Studio项目中没有达到我期望的效果。 相反,我发现了一个名为“Precompile header files”的新文件夹,其中包含cmake_pch.cxx文件…看起来target_precompile_headers所做的事情与我期望的完全不同。


你能展示一下你的CMake文件的其余部分吗?另外,文件路径和文件名是否正确?你提到你创建了 pch.h 但是你的CMake命令将该文件指定为 Source/ugpch.h... - Kevin
1
这里是 target_precompile_headers 的文档。请注意,CMake 会为您生成 PCH 文件。 - Kevin
@squareskittles 谢谢指出,我已经纠正了拼写问题,但仍然没有效果。 - Araxnid
2个回答

10

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

你需要升级你的CMake分发版(VS2019内置的版本相当新)或从安装程序中安装最新版本。

否则,你可以使用cotire来进行预编译头文件,但我的建议是升级,因为升级通常很容易完成,而且你的计算机上可能已经安装了Visual Studio附带的最新版本。


由于你更新了问题。

命令target_precompile_headers并不是你想象的那样。你不需要在这里提供你的PCH,而是提供应该包含在生成的PCH中的头文件。如果文件ugpch.h包含headera.hheaderb.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头文件将被强制包含(对于GCC是-include,对于MSVC是/FI),以便所有源文件都能访问,因此源文件不需要# include "pch.h"。

为什么会这样工作呢? CMake支持PUBLIC预编译头文件。如果链接到具有公共预编译头文件的多个目标,则您的目标将继承所有这些预编译头文件。由于编译器通常只接受一个预编译头文件,因此CMake必须为此生成聚合头文件。


1

使用旧版的cmake......我已经在Visual Studio中使用了/Yc和/Yu编译器标志。虽然不如target_precompile_headers(UGame PRIVATE Source/ugpch.h)通用,但应该可以解决问题 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接