6

如果 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_NO_SCOPED_ENUMSBOOST_NO_CXX11_SCOPED_ENUMS取决于 Boost 版本,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 支持编译?

发现的最接近的是:

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

4

1 回答 1

2

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

另请参阅我们是否需要使用 c++11 重新编译库?

于 2013-09-13T14:39:23.270 回答