18

我想将我当前的项目移动到 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

4

1 回答 1

1

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

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

这可能看起来很混乱,但配置工具链旨在处理这些混乱。

于 2013-03-01T17:04:35.377 回答