编辑:我知道如何在 VS 和 CMake 中使用它,我试图找出如何在命令行上使用 cl.exe 来完成它。
原问题: 我正在尝试在 Windows 上使用 MSVC 的预编译标头。主要是将所有 Microsoft 的标头捆绑在一个位置并预编译它们以加快编译速度。
问题是我不知道如何实际使用 pch 文件。 我尝试按照官方文档中的两个链接进行操作: 创建预编译头文件 还有这个: 使用预编译头文件
我生成的.pch文件如下:
cl /c /Ycheaders.h main.cpp
在 headers.h 中我执行以下操作:
#include <windows.h>
#include <iostream>
//--- other includes that will never change ----//
按照文档,这就是我尝试使用它的方式。
cl /Yuheaders.h main.cpp
这给我带来了以下错误: 致命错误C1854:无法覆盖在对象main.obj中创建预编译头期间形成的信息
我认为文档是错误的(因为文档中提供的命令: cl /Ycheader.h main.cpp 是错误的并且不起作用,并且它需要 /c 在它之前,如示例代码中的注释所示),它没有对我来说编译你的 main.cpp 很有意义,所以我重复了上面的步骤,使用 headers.cpp 而不是 main.cpp 创建预编译头文件,其中 headers.cpp 只是一个空源文件单个包含 headers.h 并且我收到链接错误 1 未解决的外部链接错误 1120 未指定未解决的内容。
理想情况下,如果有人有一个关于如何为 msvc 创建头文件的最小示例,然后展示如何使用它们。
假设您已经有一个没有预编译头的项目。
首先添加两个新文件:
precomp.h
和 precomp.cpp
:
precomp.cpp
就是这样:
#include precomp.h
precomp.h
是包含您想要预编译的所有内容的头文件 - 通常是系统和 CRT 头文件:
#ifndef MY_PRECOMP_H
#define MY_PRECOMP_H
#include <windows.h>
#include <vector>
#include <map>
// etc...
#endif
更新项目中的 every 非标头源文件(即 .cpp 源文件)文件,将
#include "precomp.h"
作为任何其他代码之前的 first 行。
现在,右键单击解决方案资源管理器中的项目标题:
然后选择“属性”以调出整个项目的项目设置:
在项目属性的 C/C++ 部分下。选择“预编译头”。然后启用预编译头选项为
Use (/Yu)
。将预编译头文件选项设置为 precomp.h
。然后点击确定。
最后一步。直接右键单击解决方案资源管理器中的
precomp.cpp
,然后选择“属性”。
这将显示一个与您刚刚看到的项目设置类似的对话框,但特定于该源文件。
对于此文件的预编译头选项,选择
Create (/Yc)
和预编译头选项,并选择 precomp.h
作为头文件选项。
现在进行“干净”构建,然后进行完整构建。 Precomp.cpp 将首先被编译并生成所需的
.pch
文件。所有其他源文件在编译后都会引入预编译头文件。
创建pch:
cl /EHsc /c /Ycheader.h header.cpp
使用pch:
cl /EHsc /Yuheader.h /Fpheader.pch main.cpp /link header.obj