【问题标题】:boost::filesystem::copy_file() missing symbol in c++11boost::filesystem::copy_file() 在 c++11 中缺少符号
【发布时间】:2013-09-13 10:13:50
【问题描述】:

如果编译 Boost 没有 C++11 支持 boost::filesystem 使用模拟范围枚举器。如果您随后将这个构建的 Boost 并在具有 C++11 支持的项目中使用它,您最终会丢失符号,因为 boost::filesystem::copy_file() 的声明已更改。

有一个简单的解决方法:

# if __cplusplus >= 201103L
#   define NO_SCOPED_ENUMS
# endif
# ifdef NO_SCOPED_ENUMS
#   if BOOST_VERSION < 105000
#     ifndef BOOST_NO_SCOPED_ENUMS
#       define BOOST_NO_SCOPED_ENUMS
#       define REMOVE
#     endif
#   else
#     ifndef BOOST_NO_CXX11_SCOPED_ENUMS
#       define BOOST_NO_CXX11_SCOPED_ENUMS
#       define REMOVE
#     endif
#   endif
# endif
# include "boost/filesystem.hpp"
# if defined(NO_SCOPED_ENUMS) && defined(REMOVE)
#   undef REMOVE
#   if BOOST_VERSION < 105000
#     undef BOOST_NO_SCOPED_ENUMS
#   else
#     undef BOOST_NO_CXX11_SCOPED_ENUMS
#   endif
# endif

此预处理位根据 Boost 版本定义 BOOST_NO_SCOPED_ENUMSBOOST_NO_CXX11_SCOPED_ENUMS,包括 boost/filesystem,如果之前未定义,则将其再次删除(为了安全起见)

现在这里的问题是,当我们为 C++11 编译时,作用域枚举器被关闭了:

# if __cplusplus >= 201103L
#   define NO_SCOPED_ENUMS
# endif

但是,如果 Boost 实际上已经编译 C++11 支持,这将再次中断,因为声明将被更改。它需要是这样的:

// BOOST_COMPILED_WITH_CXX11 doesn't exist
# if (__cplusplus >= 201103L) && !defined(BOOST_COMPILED_WITH_CXX11)
#   define NO_SCOPED_ENUMS
# endif

这就是我的问题所在:

tl;dr - 我可以确定 Boost 是否在编译时支持 C++11?

我最近的found 是:

无论您如何运行配置脚本,当它完成时,您会在&lt;boost-root&gt;/libs/config/ 目录中找到一个新标头-user.hpp-。 请注意,configure 默认情况下不会将此标头安装到您的 boost 包含路径中。此标头包含配置脚本生成的所有选项,以及包含默认版本(位于 /boost/config/ 下)中的用户可设置选项的标头部分。

【问题讨论】:

  • 在上面的修复中,如果 BOOST_VERSION

标签: boost c++11


【解决方案1】:

希望将 C++11 项目与非 C++11 库链接。 C++11 破坏了二进制兼容性,虽然在大多数情况下可能会奏效,但它会在某些时候咬你一口。

另见do we need to recompile libraries with c++11?

【讨论】:

  • 好的,谢谢。如果我正确理解该链接,他们想使用需要gcc-4.7+ 的 C++11。他们已经有使用4.2.1 编译的二进制文件。无论是否使用 C++11,他们都必须重新编译二进制文件,因为它们在 gcc 的主要版本之间发生变化(gcc 开发人员将其视为主要或次要版本号的变化)
  • 我不得不承认我没有仔细阅读链接,我应该有:)。在任何情况下,用 gcc-4.7 和 --stdc++11 编译项目,并与用 gcc-4.7 编译的库而不用 --std=c++11 链接都不是一个好主意。还要考虑一些头文件可能有预处理器#if,这取决于 C++11 支持是否可用。与 C++03 库相比,在编译 C++11 项目时,那些#if 的评估将有所不同。这可能会或可能不会破坏兼容性。这也适用于混合发布和调试版本。
  • 别担心,我同意你的看法 - 只是澄清链接;)
猜你喜欢
  • 2016-05-02
  • 2011-06-14
  • 2018-11-03
  • 2018-02-18
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
相关资源
最近更新 更多