【问题标题】:BOOST_ERROR_CODE_HEADER_ONLY does not have the advertised effectBOOST_ERROR_CODE_HEADER_ONLY 没有宣传的效果
【发布时间】:2015-06-29 07:48:58
【问题描述】:

在我的应用程序中,我包含 boost/system/error_code.hpp (boost 1.58) 但不想链接到 boost_system,而是有一个仅标题的解决方案。我通过定义BOOST_ERROR_CODE_HEADER_ONLY 来阅读这应该是可能的。但不幸的是,它没有按预期工作。我仍然收到 boost::system::system_category() 的链接器错误。

我想知道这是否应该有效,如果可以,如何。 boost header中的代码是:

# 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() 定义主体。如果不链接到库,这怎么能工作?

更新:

与此同时,我发现该声明的主体是在哪里定义的(在 boost/system/error_code.hpp 文件中包含的 boost/system/detail/error_code.hpp 中。但它仍然不能避免链接器错误。我正在使用 XCode(llvm C+ +11) 并在目标设置中定义了BOOST_ERROR_CODE_HEADER_ONLY,如果这很重要的话。

【问题讨论】:

  • 我之前试过这个,然后就放弃了,因为它比我关心的更麻烦。
  • 请发一个链接不正确的MCVE

标签: c++ boost xcode6


【解决方案1】:

经过一些实验,我让它工作了。这里成功的关键是在包含该标头的任何其他代码之前包含标头boost/system/error_code.hpp,并在cpp 文件中直接在包含之前定义BOOST_ERROR_CODE_HEADER_ONLY 预处理器符号。必须将其包含在 cpp 文件中,而不是,例如在预编译的头文件(stdafx.h、*_prefix.h 等)中,因为它包含仅适用于目标文件的代码。在项目/目标级别定义 BOOST_ERROR_CODE_HEADER_ONLY 也可能有效,但由于您在整个项目/目标中只需要一次,因此在第一次包含 boost 标头之前定义它更有意义。

如果您遵循此规则,您也不会受到在多个 cpp 文件中包含相同的 system_category() 代码时可能出现的重复符号问题的影响。

当您在发布模式下编译代码时,您可能仍然会遇到问题,因为编译器可能会自动删除包含的代码(如果未在该 cpp 文件中使用)。所以最好禁用它的优化。但是,由于您不希望常规代码使用它,因此为该包含创建自己的 cpp 文件并完全禁用该文件的优化是有意义的。这就是我最终的结局。

【讨论】:

  • 我找到了一种方法来阻止优化器从静态库中删除引用。这通过手动引用generic_categorysystem_category 来工作,这可以防止优化器从静态库中删除引用:boost::system::error_category const& reference_generic_category___() { return boost::system::generic_category(); } boost::system::error_category const& reference_system_category___() { return boost::system::system_category(); }
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多