如何使用多个预编译headers;一些来自图书馆
How to use multiple precompiled headers; some from a library
我认为这不是我的项目独有的,它适用于任何使用预编译 headers 的 C++ 库和使用具有自己的预编译库的项目 header秒。只是 C++/winRt headers 太耗时了,你真的需要预编译它们。
我有一个 C++/winRT UWP 库。由于它使用 windows 运行时 API,因此它 'needs' 预编译那些庞大的 header 文件。我将该文件称为 'btwrpch.h',因为它主要包含蓝牙运行时 API。库构建良好。
现在这个库将用于另一个 C++/winRT UWP 项目,该项目也使用 windows 运行时,主要是 UI 东西。该项目的预编译 headers 使用经典的 pch.h.
要使用库,项目有库 header 个文件,包括 btwrpch.h。该项目有自己的 pch.h 文件。
我不知道如何为两者创建预编译的 header。
在项目中我放置了 btwrpch.cpp 文件和 pch.cpp 文件。我将这些 cpp 文件中的每一个都配置为生成预编译的 headers.
在项目属性预编译header选项中我有两个文件,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 文件外),其中包括两个 header。查看 Debug 目录,我看到 pch.pch 和 btwrpch.pch.
我做错了什么?
请注意,如果我将 btwrpch.h 文件合并到 pch.h 中并只定义一个预编译的 header,它就可以正常工作。我不希望图书馆用户必须这样做。
虽然每个项目可以有多个 precompiled header files,但每个编译单元最多可以有一个预编译头文件。显然,您正在将多个预编译头文件拉到一个编译单元中。这是不支持的。
What am I doing wrong?
您正在将预编译头文件包含到其他头文件中。这不是它们的用途。仅将预编译头文件包含到编译单元中。
这里的解决方案很简单:从您的库的 public 接口(定义 API 的头文件)中删除所有预编译的头文件。相反,包括库接口所依赖的所有头文件,就好像您根本没有使用预编译头文件一样。
使用此库时,将库头文件包含到用于生成预编译头的编译单元中(例如,通过将 #include "mylib.h"
指令添加到 pch.h)。有了它,库接口及其所有依赖项都会在使用项目中预编译。
我认为这不是我的项目独有的,它适用于任何使用预编译 headers 的 C++ 库和使用具有自己的预编译库的项目 header秒。只是 C++/winRt headers 太耗时了,你真的需要预编译它们。
我有一个 C++/winRT UWP 库。由于它使用 windows 运行时 API,因此它 'needs' 预编译那些庞大的 header 文件。我将该文件称为 'btwrpch.h',因为它主要包含蓝牙运行时 API。库构建良好。
现在这个库将用于另一个 C++/winRT UWP 项目,该项目也使用 windows 运行时,主要是 UI 东西。该项目的预编译 headers 使用经典的 pch.h.
要使用库,项目有库 header 个文件,包括 btwrpch.h。该项目有自己的 pch.h 文件。
我不知道如何为两者创建预编译的 header。
在项目中我放置了 btwrpch.cpp 文件和 pch.cpp 文件。我将这些 cpp 文件中的每一个都配置为生成预编译的 headers.
在项目属性预编译header选项中我有两个文件,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 文件外),其中包括两个 header。查看 Debug 目录,我看到 pch.pch 和 btwrpch.pch.
我做错了什么?
请注意,如果我将 btwrpch.h 文件合并到 pch.h 中并只定义一个预编译的 header,它就可以正常工作。我不希望图书馆用户必须这样做。
虽然每个项目可以有多个 precompiled header files,但每个编译单元最多可以有一个预编译头文件。显然,您正在将多个预编译头文件拉到一个编译单元中。这是不支持的。
What am I doing wrong?
您正在将预编译头文件包含到其他头文件中。这不是它们的用途。仅将预编译头文件包含到编译单元中。
这里的解决方案很简单:从您的库的 public 接口(定义 API 的头文件)中删除所有预编译的头文件。相反,包括库接口所依赖的所有头文件,就好像您根本没有使用预编译头文件一样。
使用此库时,将库头文件包含到用于生成预编译头的编译单元中(例如,通过将 #include "mylib.h"
指令添加到 pch.h)。有了它,库接口及其所有依赖项都会在使用项目中预编译。