混合C++ABI以针对遗留库进行构建
Mixing C++ ABIs to build against legacy libraries
情况是,我有一个C++代码库,它使用了最近的GCC(4.3.3),但我需要链接到一个使用GCC 3.2.3构建的旧库。没有新版本的库可用,我不能没有它,而且它是封闭源代码的,所以无法重建。
这似乎带来了一个问题,因为GCC 4.3.3和3.2.3之间存在ABI不兼容,所以我想看看我有什么选择来解决这个问题。
一些附加细节:
- 我可以用-fabiversion=1重建代码库中的所有内容,以获得正确的ABI版本,但我依赖于libstdc++版本6中的一些更新功能
- 代码库之外的所有C++库依赖项都是开源的,所以我可以根据需要重新构建它们,除了这一个库
- 许多C库依赖项无法重建或很难重建
- 旧库似乎依赖于libstdc++版本5的一些功能
到目前为止,我已经尝试过:
- 使用-fabiversion=1重建所有C++代码和依赖库,并链接到libstdc++版本6。这失败了,因为C++标准库符号出现了一些未定义的符号错误
- 与上面相同,但在libstdc++5的共享库中添加了链接,这解决了链接器问题,但似乎会导致两个版本在运行时在遗留库中混合,从而导致崩溃
我读过这一页:http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html,这似乎表明可以在应用程序中混合C++abi版本,以满足库之间不同的依赖关系。不过,除非我遗漏了什么,否则它在这里似乎不太好用。
有什么想法吗?
好的,您的解决方法是:
- 为旧的C++库编写一个"C"接口,用3.2.3编译,这样它就可以工作了
- 现在您可以在新编译器中使用C接口了
您可以围绕C库编写一些C++"包装器"代码,以便将其用作C++,但这些代码将在新编译器中构建。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 构建一个由C和C++文件组成的库
- llvm构建器向基本块添加终止符
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- 如何跨平台将二进制资源构建到程序中?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 如何解决 Ninja c++ 构建和执行问题
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 对于哪些 ABI,我可以使用 NDK v10e 构建 apk?
- progam (C++ ABI 1002) 和 lib (C++ ABI 1009) 构建版本不匹配:
- 混合C++ABI以针对遗留库进行构建