在我的应用程序中,我包括boost/system/error_code.hpp(boost 1.58),但不想链接到boost_system,而是有一个只有标头的解决方案.我读到定义BOOST_ERROR_CODE_HEADER_ONLY应该是可能的.但不幸的是,它没有按预期工作.我仍然得到boost :: system :: system_category()的链接器错误.
我想知道这是否应该起作用,如果是这样的话.boost标头中的代码是:
# ifdef BOOST_ERROR_CODE_HEADER_ONLY
inline const error_category & system_category() BOOST_SYSTEM_NOEXCEPT;
inline const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT;
#else
BOOST_SYSTEM_DECL const error_category & system_category() BOOST_SYSTEM_NOEXCEPT;
BOOST_SYSTEM_DECL const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT;
#endif
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,没有为system_category()定义主体.如果没有链接到lib,这怎么可以工作呢?
更新:
在此期间,我发现了声明的主体定义在哪里(文件中boost/system/detail/error_code.hpp包含了boost/system/error_code.hpp它.仍然没有避免链接器错误.我正在使用XCode(llvm C++ 11)并BOOST_ERROR_CODE_HEADER_ONLY在目标中定义设置,如果重要的话.
经过一些实验,我得到了它的工作.这里成功的关键是在包含该标头的boost/system/error_code.hpp任何其他代码之前包含标头BOOST_ERROR_CODE_HEADER_ONLY,在cpp文件中直接在include之前定义预处理器符号.必须将它包含在cpp文件中,而不是例如在预编译的头文件中(stdafx.h,*_prefix.h等),因为它包含的代码只能在目标文件中使用.BOOST_ERROR_CODE_HEADER_ONLY在项目/目标级别定义也可能有效,但由于在整个项目/目标中只需要一次,因此在第一次包含boost头之前定义它更有意义.
如果您遵循此规则,您也不会受到system_category()在多个cpp文件中包含相同代码时可能出现的重复符号问题的影响.
在发布模式下编译代码时,您可能仍会遇到问题,因为编译器可能会自动删除包含的代码(如果未在该cpp文件中使用).所以最好禁用它的优化.但是,由于您不希望将其用于常规代码,因此为此包含创建自己的cpp文件并完全禁用该文件的优化是有意义的.这就是我最终的结局.
| 归档时间: |
|
| 查看次数: |
1490 次 |
| 最近记录: |