c++ - 如何在内部使用 C++ 异常并可以在旧平台上运行的 linux x64 上创建共享库对象?

标签 c++ linux exception shared platform

如何在一个 Linux x64(例如 Red Hat 7.x)平台上创建一个内部使用 C++ 异常(没有跨越 .so 边界的异常)的基于 C++ 的共享库,使其可以运行在与共享库 ABI 兼容的其他平台上(例如 Red Hat 5.x 或 Red Hat 8.x)?

.so 不使用 C++ 标准库(除了 ),但在内部使用 C++ 异常。它的外部 API 仅为 C,所有异常都在内部捕获(包括使用“catch(...)”以确保安全)。

现在的经验是,尽管在 GLIBC 中进行了版本控制,但使用 GCC 4.7.2 构建并由主程序通过 dlopen 加载的 .so 确实可以在具有 libc.so.6 等的系统上运行 2.12 版,但不能在一个 2.5 版本的系统,在抛出异常时会发生奇怪的 abort() 和 terminate() 调用。

.so 是使用“-fabi-version=2”编译的。在任何平台上都不会发生链接器/加载器错误。

所以我的问题是如何完成构建这样一个可以在旧平台上运行的 .so 的任务?这一定是可能的。

最佳答案

在 Linux 上,g++libstdc++libgcc_s 链接到您的可执行文件和共享库。

我会尝试使用 -static-libgcc-static-libstdc++ 将它们静态链接到您的共享库中。然后检查 ldd my.so 输出以确保您的共享库没有链接不需要的 .so

关于c++ - 如何在内部使用 C++ 异常并可以在旧平台上运行的 linux x64 上创建共享库对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36455453/

相关文章:

linux - 对另一个库中函数的 undefined reference

php - 一个仅将参数传递给另一个函数的函数是否应该对该参数进行类型检查?

java - java如何捕获java内部的退出代码?

c++ - astyle 没有缩进以 .或 ->

c++ - 在 Node.js 插件的 void * 中检索和存储 V8 对象

python - 对齐和裁剪相同的场景图像

python - 使用 PPID 创建文件

c++ - 如何编译需要 <winsock2.h> 的 c++ 项目?

c++ - 与自定义 ListView 控件交互(获取项目数、循环、单击每个项目)?

java - 发生异常时如何定位lambda?