【发布时间】:2017-11-15 14:20:25
【问题描述】:
经过许多类似的问题(见下文),我认为其中没有一个涵盖此案例。
问题
是否可以从使用 gcc 4.1 编译的 C++03 应用程序中打开并使用使用 gcc 4.9 编译的 C++11 共享库?库和应用程序都使用 libstdc++,包括在 API 上(但不是 std::list,这显然是一个问题)。我无法更改应用程序的编译方式(很遗憾),并且必须确保现有代码不会中断(例如,如果它最终动态链接到新版本的 libstdc++.so)。
据我了解(不是很清楚),在 Linux 上,动态链接器使用平面命名空间,这意味着不可能在两个库中定义相同的符号。将库静态链接到较新的 libstdc++ 是否有帮助,或者可能有其他方法?
一些类似的问题似乎无法回答这个问题
【问题讨论】:
-
我认为 GCC 在 5.1 版本中引入了 ABI 中断。你试过了吗?
-
试过什么?针对较新版本的 libstdc++ 运行应用程序(例如通过 LD_PRELOAD)?
-
Linux 共享对象支持符号版本控制 (gcc.gnu.org/wiki/SymbolVersioning),我认为这应该已经适用于您的情况。然而,有些人认为,版本化符号本身会引入完全不同级别的问题 (harmful.cat-v.org/software/dynamic-linking/versioned-symbols)。
标签: c++ c++11 gcc shared-libraries libstdc++