【发布时间】:2013-07-01 06:27:51
【问题描述】:
在 Mac 上处理 libc++ 和 stdlibc++ 之间的 ABI 不一致的好方法是什么(如果有)?
问题:许多 c++11 功能需要 C++ 标准库的新 libc++ 实现。但是 libc++ 与旧的 libstdc++ 不兼容 ABI,而目前大多数软件通常链接到后者。例如,系统编译器仍然使用 stdlibc++,这意味着我所有使用 macports 安装的库对于像字符串这样的标准类都有不同的 ABI,并且无法与大量使用 c++11 的项目链接。
我目前的解决方案:保留两个版本的库,这通常会导致问题(boost、opencv 等)并链接到适当的版本。
我想有人可能会建议,如果我真的想使用 libc++,我应该使用 stdlibc++ 清除我的系统中的任何内容,并确保来自 macports(或其他任何地方)的任何内容仅与 libc++ 链接。您可以看到这项任务看起来是多么艰巨。
有没有人想出一个很好的方法来与我们生活的这个“between-stdlib-limbo”相关联? :)
编辑:我正在更明确地提出一个隐含的后续问题:Apple 在他们的系统中同时提供了 libc++ 和 libstdc++。假设一个人攻击了根本问题并尝试切换到 libc++-only。鉴于当前安装在系统上的 100% 库(一些随系统附带,其中大部分通过 macports,少数通过手动编译)链接到 libstdc++(如果有的话),从 libstdc++ 切换到 libc++ 的推荐方法是什么)?有没有人这样做并幸存下来?
【问题讨论】:
-
所有链接在一起的代码应该使用相同的标准库实现和版本。其他一切都被称为不兼容,并且从未打算工作。
-
是的,当然。这就是整个问题——我们同时有两个不兼容的标准库实现在流通。我的问题是人们采取了哪些策略来处理这个问题。
-
这就是策略。还有更多的标准库实现,它们彼此不兼容,并且将永远保持这种状态。