在我的应用中,我添加boost/system/error_code.hpp
(提升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
正如您所看到的,没有为system_category()定义主体。如果没有链接到lib,它怎么能工作呢?
更新
与此同时,我发现该声明的主体定义在哪里(boost/system/detail/error_code.hpp
包含在boost/system/error_code.hpp
文件中。但它仍然无法避免链接器错误。我正在工作在XCode(llvm C ++ 11)中,如果重要的话,在目标设置中定义了BOOST_ERROR_CODE_HEADER_ONLY
。
答案 0 :(得分:5)
经过一些实验后我才开始工作。这里成功的关键是在包含该标头的任何其他代码之前包含标头boost/system/error_code.hpp
,并在cpp文件中直接在include之前定义BOOST_ERROR_CODE_HEADER_ONLY
预处理器符号。必须将其包含在cpp文件中,而不是,例如在预编译的头文件(stdafx.h,* _prefix.h等)中,因为它包含的代码只能在目标文件中使用。在项目/目标级别定义BOOST_ERROR_CODE_HEADER_ONLY
也可能有效,但由于在整个项目/目标中只需要一次,因此在第一次包含boost头之前定义它更有意义。
如果您遵循此规则,您也不会受到在多个cpp文件中包含相同system_category()
代码时可能出现的重复符号问题的影响。
在发布模式下编译代码时,您可能仍会遇到问题,因为编译器可能会自动删除包含的代码(如果未在该cpp文件中使用)。所以最好禁用它的优化。但是,由于您不希望将其用于常规代码,因此为此包含创建自己的cpp文件并完全禁用该文件的优化是有意义的。这就是我最终的结局。