boost::filesystem::copy_file()在c++;11

boost::filesystem::copy_file()在c++;11,boost,c++11,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 # i

如果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实际上是用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支持编译吗?

最接近我的是:

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


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


另请参见

好的,谢谢。如果我正确理解该链接,他们希望使用C++11,这将需要
gcc-4.7
+。他们已经用
4.2.1
编译了二进制文件。无论是否使用C++11,他们都必须重新编译二进制文件,因为它们在gcc的主要版本之间进行更改(gcc开发人员将其视为主要或次要版本号的更改)。我必须承认,我没有彻底阅读链接,我应该:)。在任何情况下,使用--stdc++11编译带有gcc-4.7的项目,并在不使用--std=c++11的情况下链接使用gcc-4.7编译的库都不是一个好主意。同时考虑一些头可能有预处理器,如果是基于C++ 11的支持是否可用。与C++03库相比,在编译C++11项目时,这些#if’s的计算结果会有所不同。这可能会破坏兼容性,也可能不会破坏兼容性。这也适用于混合发布版本和调试版本。别担心,我同意你的观点-只是澄清链接;)
// BOOST_COMPILED_WITH_CXX11 doesn't exist
# if (__cplusplus >= 201103L) && !defined(BOOST_COMPILED_WITH_CXX11)
#   define NO_SCOPED_ENUMS
# endif