c++ - 如何在 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
我预期的完全不同
解决方案
该命令target_precompile_headers
已在 CMake 3.16 中添加。
你要么必须升级你的 CMake 发行版(VS2019 中的发行版是最新的),要么从安装程序中安装最新的。
否则,您将不得不使用 cotire 作为预编译头文件,但我的建议是升级,因为它通常很容易做到,而且您的计算机上可能已经有了 Visual Studio 附带的最新版本。
既然你更新了你的问题。
该命令target_precompile_headers
没有按照您的想法执行。你不在那里提供你的 PCH,你提供什么标题应该是生成的 PCH 的一部分。如果文件ugpch.h
包含包含 for和headera.h
,那么您的预编译头命令应该如下所示:headerb.h
headerc.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 必须生成聚集的标头才能使其正常工作。
推荐阅读
- java - 嵌套的 While 循环和嵌套的 if...else Java
- python - 有没有办法改变 matplotlib 中 x/y 刻度的 alpha 值?
- javascript - 如何将 JS 数组传递给 PHP
- python - Scrapy - 将抓取的数据返回给函数(Python)
- arrays - 找出矩阵中权重最小和权重最大的路径
- html - 删除 HTML Textarea 调整大小图标
- vue.js - 如何使 Vue 属性与 Vue 中的另一个属性有条件?
- c++ - Ubuntu上的opencv dnn模块问题
- geometry - 计算移动圆接触矩形时的位置
- laravel - 获取表 laravel 中选定行的 id