BOOST_ERROR_CODE_HEADER_ONLY没有广告效果

时间:2015-06-29 07:48:59

标签: c++ boost xcode6

在我的应用中,我添加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

1 个答案:

答案 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文件并完全禁用该文件的优化是有意义的。这就是我最终的结局。