如何使用多个预编译头文件;一些来自图书馆

时间:2019-04-16 13:15:46

标签: uwp precompiled-headers c++-winrt

我认为这不是我的项目所独有的,它适用于任何使用预编译头的C ++库以及使用具有自己的预编译头的库的项目。只是C ++ / winRt标头非常耗时,您真的需要对其进行预编译。

我有一个C ++ / winRT UWP库。由于它使用Windows运行时API,因此“需要”预编译那些庞大的头文件。我称该文件为“ btwrpch.h”,因为它主要包含蓝牙运行时API。库很好。

现在,此库将在另一个C ++ / winRT UWP项目中使用,该项目也使用Windows运行时,主要是UI内容。该项目的预编译头使用经典的pch.h。

要使用该库,项目需要包含btwrpch.h的库头文件。该项目具有自己的pch.h文件。

我无法弄清楚如何为两者创建预编译的头文件。

在项目中,我放置了btwrpch.cpp文件和pch.cpp文件。我将每个cpp文件配置为生成预编译的头文件。

在项目属性预编译头选项中,我有两个文件 pch.h; btwrpch.h 和两个输出文件 $(IntDir)pch.pch;。 $(IntDir)btwrpch.pch;

但是,当我重建项目时,我得到了错误

fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "pch.h; btwrpch.h"' to your source?

我有一个名为app.cpp的源文件(除了header.cpp文件外),其中包括两个头。在Debug目录中,我看到了pch.pch和btwrpch.pch。

我在做什么错?

请注意,如果我将btwrpch.h文件合并到pch.h中,并且仅定义了一个预编译的头文件,它将正常工作。我不希望图书馆用户这样做。

1 个答案:

答案 0 :(得分:1)

虽然每个项目可以有多个precompiled header files,但是每个编译单元最多可以有一个预编译头。显然,您是将多个预编译的头文件拖到一个编译单元中。不支持。

  

我在做什么错了?

您正在将预编译的头文件包含在其他头中。这不是要使用它们的方式。仅将预编译的头文件包含在编译单元中。

这里的解决方案很简单:从库的公共接口中删除所有预编译的头文件(定义API的头文件)。而是包括库接口所依赖的所有头文件,就好像您根本没有使用预编译头一样。

使用此库时,请将库头文件包含到用于生成预编译头的编译单元中(例如,通过在pch.h中添加#include "mylib.h"指令)。有了这个,库接口及其所有依赖项都将在使用项目中预编译。