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

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

在经历了一些类似的问题(见下文)后,我认为没有任何一个涵盖这种情况。

问题

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

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

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

最佳答案

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

一旦你这样做了,它应该就可以工作了,除非你遇到了你已经列出的几个兼容性陷阱,并且只要库接口(interface)的 C++ 部分实际上坚持 C++98 子集,不使用任何在语言子集中无法表达的构造。

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

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

关于c++ - 在 Linux 中使用 gcc 4.1 编译的 C++03 应用程序中使用 C++11 共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47309819/

相关文章:

c++ - 对于指向派生对象的基类型指针,make_unique 的语法是什么?

c++ - 为什么我的删除按钮没有删除 QHBoxLayout 上的所有小部件

c++ - 使用 gdb 调试附加进程 - 如何跳出循环

c++ - 为什么 C++ 对函数原型(prototype)(签名)的前向声明更加严格?

c++ - 循环提升仍然是 C 代码的有效手动优化吗?

c - GCC 9.3.0中 `rand()`的定义

c++ - Windows MSG 结构与遗留项目代码结构 MSG 冲突

c++ - 用于频繁分配和释放的基于轻树的数据结构的内存分配器

c++ - Clang 访问修饰符顺序和 decltype

c++ - Sublime 上的 EasyClangComplete 有什么用?