gpt4 book ai didi

c++ - BOOST_ERROR_CODE_HEADER_ONLY 没有宣传的效果

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:04 25 4
gpt4 key购买 nike

在我的应用程序中,我包含了 boost/system/error_code.hpp (boost 1.58) 但不想链接到 boost_system,而是有一个仅 header 的解决方案。我通过定义应该可行的 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/detail/error_code.hpp 中,它包含在 boost/system/error_code.hpp 文件。它仍然不能避免链接器错误。我正在使用 XCode (llvm C++11) 并在目标设置中定义了 BOOST_ERROR_CODE_HEADER_ONLY,如果这很重要的话。

最佳答案

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

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

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

关于c++ - BOOST_ERROR_CODE_HEADER_ONLY 没有宣传的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31110409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com