繁体   English   中英

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

[英]How to add precompiled headers in CMake for visual studio generator

CMake 3.18; 对比 2019;

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

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

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

在 CMake 3.16 中添加了命令target_precompile_headers

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

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


既然你更新了你的问题。

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

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

实际预编译的 header 将由 CMake 生成。

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

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

来自 CMake 文档:

header 文件列表用于生成名为 cmake_pch.h|xx 的 header 文件,用于生成预编译的 Z099FB995346F31C749F6E40DB0F395E3.p 文件。 cmake_pch.h|xx header 文件将被强制包含在所有源文件中(-include 用于 GCC,/FI 用于 MSVC),因此源不需要具有#include“pch.h”。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM