如果编译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_ENUMS
或BOOST_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 /)下的用户可设置选项的标题部分。
答案 0 :(得分:2)
您不想要将C ++ 11项目与非C ++ 11库链接。 C ++ 11打破了二进制兼容性,虽然在大多数情况下它可能会起作用,但在某些时候它会让你陷入困境。