使用 cl 编译器从命令行构建时使用 msvc 中的预编译头

问题描述 投票:0回答:2

编辑:我知道如何在 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 创建头文件的最小示例,然后展示如何使用它们。

c++ visual-studio precompiled-headers cl
2个回答
0
投票

假设您已经有一个没有预编译头的项目。

首先添加两个新文件:

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
文件。所有其他源文件在编译后都会引入预编译头文件。


0
投票

创建pch:

cl /EHsc /c /Ycheader.h header.cpp

使用pch:

cl /EHsc /Yuheader.h /Fpheader.pch main.cpp /link header.obj
© www.soinside.com 2019 - 2024. All rights reserved.