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

时间:2013-09-13 10:13:50

标签: boost c++11

如果编译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,如果之前未定义,则会再次将其删除(为了安全)< / p>

现在问题是我们在编译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是:

  

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

1 个答案:

答案 0 :(得分:2)

想要将C ++ 11项目与非C ++ 11库链接。 C ++ 11打破了二进制兼容性,虽然在大多数情况下它可能会起作用,但在某些时候它会让你陷入困境。

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