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

时间:2013-02-20 13:03:10

标签: c++ boost c++11

我想将当前项目移至C ++ 11。代码全部使用clang ++ -std = c ++ 0x编译。这是容易的部分:-)。困难的部分是处理外部图书馆。人们不能依赖于将一个C ++ 11对象与未使用c ++ 11编译的外部库相链接(参见http://gcc.gnu.org/wiki/Cxx11AbiCompatibility)。例如,Boost肯定需要重建(Why can't clang with libc++ in c++0x mode link this boost::program_options example?)。我有我使用的所有外部库的源代码,所以我可以(有些痛苦)从理论上用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

1 个答案:

答案 0 :(得分:1)

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

对于安装在单独的并行目录树中的C ++ 11第三方库,这不是绝对必要的。库版本已经存在了很长时间,允许您在系统或任何地方并排放置不同的版本,再次基于configure。

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