在转换到C++ 11期间管理外部库(例如boost)

Mat*_*lis 18 c++ boost c++11

我想将我当前的项目移动到C++ 11.代码全部使用clang ++ -std = c ++ 0x编译.这是容易的部分:-).困难的部分是处理外部图书馆.人们不能依赖于将一个C++ 11对象与未使用c ++ 11编译的外部库相链接(请参阅http://gcc.gnu.org/wiki/Cxx11AbiCompatibility).例如,Boost肯定需要重新构建(为什么不能用c ++ 0x模式中的libc ++来链接这个boost :: program_options示例?).我有我使用的所有外部库的源代码,所以我可以(有些痛苦)从理论上用C++ 11重新构建这些库.但是,这仍然存在一些问题:

在混合C++ 03/C++ 11环境中开发:我有一些使用C++ 03的旧项目,需要偶尔进行维护.当然,我想将这些与现有版本的外部库链接起来.但是对于我当前(和新)的项目,我想链接到我重新构建的C++ 11版本的库.如何组织我的开发环境(目前是Ubuntu 12.04和Mac OS X 10.7)来应对这种情况?

我假设很多开发人员都会遇到这个问题.它不会消失,但我没有找到推荐的,普遍认可的解决方案.

部署:目前,我部署到云中的Ubuntu 12.04 LTS服务器.经验导致一个人(在可能的情况下)依赖于linux发行版提供的标准包(例如libboost).如果我将当前项目移动到c ++ 11,我的理解是我将不得不构建自己的外部库版本.我的猜测是,在某些时候这将改变,并且它们将是具有C++ 11兼容性的库标准的"标准"版本.当有人预料到会发生这种情况时,有谁有任何想法?并且可能这也需要上述问题的标准解决方案 - 在同一平台上同时存在C++ 03库和C++ 11库.

我希望我错过了一些基本的东西,以便这些感知的问题在适当的信息中消失!我是否想过早地转向C++ 11?

更新(2013-09-11):macports的相关讨论:https://lists.macosforge.org/pipermail/macports-users/2013-September/033383.html

And*_*ndy 1

您应该使用配置工具链(例如自动工具)来“正确”配置目标部署的构建。您的配置测试应检查 ABI 兼容的 C++11 二进制文件,并指示链接器在检测到时首先使用它们。如果没有,可选择失败或回退到 C++03 构建。

至于安装在单独的并行目录树中的 C++11 第三部分库,这并不是绝对必要的。库版本控制已经存在很长时间了,它允许您将不同的版本并排放置在系统上或任何您想要的地方,同样基于配置。

这可能看起来很混乱,但配置工具链就是为了处理这些混乱而设计的。