如何编写C .so库来替换现有的C ++ .so库?

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

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

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

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

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

我该如何实现呢?

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

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

编辑#2有帮助。

基本上你的bar.exe正在尝试为该库进行C ++运行时初始化。

您必须至少提供相同损坏名称的空实现,以便bar.exe可以动态搜索您的.so并查找/调用它们。

如果你不那么幸运,你可能需要让这些函数做一些有意义的事情,以便上层代码解释为成功。

祝好运

给他们相同的名字,并放入不同的目录。 使用LD_LIBRARY_PATH env。 用于在任何其他目录之前使用所需库设置目录的变量。