根据 this answer boost 和 STL header 属于预编译 header 文件(MSVC 世界中的stdafx.h
)。所以我更改了我的动态链接库项目的 header ,并将所有 STL/Boost header 移动到我项目的 stdafx.h
中。
之前
#include <boost/smart_ptr.hpp>
namespace XXX
{
class CLASS_DECL_BK CExampleClass // CLASS_DECL_BK is just a standard dll import/export macro
{
private:
boost::scoped_ptr<Replica> m_replica;
}
}
之后
namespace XXX
{
class CLASS_DECL_BK CExampleClass
{
private:
boost::scoped_ptr<Replica> m_replica;
}
}
现在我有减少编译时间的优势,但是我的库的所有用户都遇到构建错误(例如未知的 boost::scoped_ptr...),因为缺少包含(这是现在移至我的 stdafx.h
)。
什么可以解决这个难题?
我希望减少编译时间和包含我的头文件后的编译错误对于 dll 的任何用户来说都是 Not Acceptable 。
这有帮助吗?
- 保留所有包含指令,但在我的“stdafx.h”中复制它们?由于 stdafx.h 始终首先包含在我项目的任何 cpp 文件中,所以我应该没问题,用户不会收到任何错误。或者,如果在一个翻译单元中多次包含相同的 header (有 header 保护),我是否会失去速度优势?
感谢任何提示!
最佳答案
当您将 header 包含在库 header 中,并将它们另外放入 stdafx.h
时,您应该几乎获得相同的速度提升。
或者,您可以添加一个额外的定义(批量 external include guard )
// stdafx.h
#define MY_LIB_STD_HEADERS_ALREADY_INCLUDED
// library_file.h
#ifndef MY_LIB_STD_HEADERS_ALREADY_INCLUDED
#include <boost/smart_ptr.hpp>
...
#endif
但只有当您确定有帮助时,我才会这样做。只需拿一个秒表并运行一些重新编译。 (不需要链接。)然后你会看到有什么不同。
一边
我不确定在项目某处中添加所有所需的boost header 是否是个好主意。我会说 shared_ptr
和 friend ,boost/foreach
,也许 Boost.Format,... 是个好主意,但我已经对 Boost 进行了三思。正则表达式 header 。 注:我did not do any speed measurements ,但我依稀记得 pch 文件的大小问题和一些编译器问题。我真的should do some tests .
还要检查有问题的 Boost 库是否提供转发 header ,以及您是否应该包含它们。膨胀预编译的头文件可能有它的缺点。
关于c++ - 库构建器的预编译头文件用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7280571/