在c ++ 11中,boost :: filesystem :: copy_file()缺少符号

Mat*_*son 5 boost c++11

如果在没有 C++ 11支持的情况下编译Boost,则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
Run Code Online (Sandbox Code Playgroud)

此预处理位定义BOOST_NO_SCOPED_ENUMSBOOST_NO_CXX11_SCOPED_ENUMS取决于Boost版本,包含boost/filesystem然后再次删除它(如果之前未定义)(为了安全)

现在问题是我们在编译C++ 11时关闭了作用域枚举器:

# if __cplusplus >= 201103L
#   define NO_SCOPED_ENUMS
# endif
Run Code Online (Sandbox Code Playgroud)

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

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

这是我的问题所在:

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

发现的最接近的是:

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

the*_*amb 2

不想将 C++11 项目与非 C++11 库链接。C++11 破坏了二进制兼容性,虽然在大多数情况下一切都可以工作,但在某些时候它会咬你的屁股。

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