gpt4 book ai didi

c++ - 如何编写C .so 库来替代现有的C++ .so 库?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:06 24 4
gpt4 key购买 nike

让我解释一下这个场景。我们有一个遗留的 C++ 编译的 .so 库。此库中的函数是使用 extern "c"{} 声明的,因此 C 和 C++ 程序都可以使用该库,另外,出于某种原因,它是使用 --static 创建的-libgcc 选项。

这个旧库很旧,很难维护。现在我们已经设法用 C 语言编写了它的替代品。假设旧库称为 libfoo.so(old),新库称为 libfoo.so(new)。对于给定的 bar.o,它可以与旧的或新的 libfoo.so 链接以创建可执行文件,例如 bar.exe。但是 bar.exe 只能使用它之前链接的同一个 .so 库运行,换句话说,这两个库不能相互交换。

编辑#1:我创建了一个名为 libfoo.so 的符号链接(symbolic link)以指向 libfoo.so(旧)或 libfoo.so(新)。此符号链接(symbolic link) libfoo.so 在运行时位于 LD_LIBRARY_PATH 中。

EDIT#2:当我将 bar.o 与旧的 libfoo.so 链接并生成 bar.exe 时,如果我使用新的 libfoo.so 运行此 bar.exe,它会报告错误 undefined symbol 。通过nm这两个libfoo.so,我可以在旧的中找到这些符号,但在新的中找不到。这些符号类似于 _ZSt4cerr,这是一个 C++ lib 损坏的名称(我虽然它是由 --static-libgcc 带来的),当然还有新的 libfoo.so不包含那种符号。

编辑#3:如果我只是用 g++ 而不是 gcc 编译和链接 C 代码,这有意义吗?

我应该如何实现?

EDIT#4:今天我设法用 g++(使用静态 libgcc、静态 libstdc++)编译/链接新的 C 编程 libfoo,这可能导致所有 c++ 符号都包含在 libfoo 中。所以。这可以让一切顺利进行,但不是我真正想要的。

最佳答案

如果你建立并链接到新的,你能让它与旧的链接吗?听起来您生成了一个二进制兼容库,但只是在一个方向上。

关于c++ - 如何编写C .so 库来替代现有的C++ .so 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2371073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com