在Linux中使用gcc 4.1编译的C ++ 03应用程序中使用C ++ 11共享库?

时间:2017-11-15 14:20:26

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

经过一系列类似的问题(见下文),我认为其中任何一个都不包括这个问题。

问题

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

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

一些似乎没有回答此问题的类似问题

2 个答案:

答案 0 :(得分:2)

如果你这样做,你肯定需要使用更新的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一起使用,一切正常,就像魔法一样,但是你不会在这里问,我假设。)

答案 1 :(得分:1)

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

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