【问题标题】:Using a C++11 shared library in a C++03 application that was compiled with gcc 4.1 in Linux?在 Linux 中使用 gcc 4.1 编译的 C++03 应用程序中使用 C++11 共享库?
【发布时间】:2017-11-15 14:20:25
【问题描述】:

经过许多类似的问题(见下文),我认为其中没有一个涵盖此案例。

问题

是否可以从使用 gcc 4.1 编译的 C++03 应用程序中打开并使用使用 gcc 4.9 编译的 C++11 共享库?库和应用程序都使用 libstdc++,包括在 API 上(但不是 std::list,这显然是一个问题)。我无法更改应用程序的编译方式(很遗憾),并且必须确保现有代码不会中断(例如,如果它最终动态链接到新版本的 libstdc++.so)。

据我了解(不是很清楚),在 Linux 上,动态链接器使用平面命名空间,这意味着不可能在两个库中定义相同的符号。将库静态链接到较新的 libstdc++ 是否有帮助,或者可能有其他方法?

一些类似的问题似乎无法回答这个问题

【问题讨论】:

标签: c++ c++11 gcc shared-libraries libstdc++


【解决方案1】:

如果你这样做,你肯定需要使用更新的libstdc++.so.6,它应该与基于 GCC 4.1 的系统libstdc++.so.6 兼容(从某种意义上说,GCC 上游打算保留库的 ABI 兼容性)。使用 GCC 4.9 编译器附带的 libstdc++.so.6 库是一个非常好的主意。

一旦你这样做了,它应该工作,除非你遇到了你已经列出的几个兼容性问题,并且只要库接口的 C++ 部分实际上坚持 C ++98 子集,并且不使用任何不能在语言子集中表达的结构。

所有这些都假定库实际上是在使用 GCC 4.1 的系统上编译的,它可能有类似 glibc 2.5 的东西。如果库是在完全不同的较新系统上编译的,那么您可能会遇到libstdc++.so.6 之外的库兼容性问题,并且这些库往往更难升级。

(也有可能该库被显式编译用于基于 4.1 的系统 libstdc++.so.6 并且一切正常,就像魔术一样,但我想你不会在这里问。 )

【讨论】:

    【解决方案2】:

    如果您仍然有问题,可以选择使用静态链接的 C-API 库作为两者之间的边界,即应用程序和您的库,请参阅this post

    您也可以明确要求旧版本的符号,请参阅this post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2011-03-11
      • 1970-01-01
      • 2011-11-05
      相关资源
      最近更新 更多