2010-03-03 41 views
5

让我来解释一下这个场景。我们有一个传统的C++编译.so库。这个库中的函数声明为extern "c" {},所以该库可以被C和C++程序使用,另外,由于某种原因它使用--static-libgcc选项创建。如何编写C .so库来替代现有的C++ .so库?

这个旧图书馆很古老,很难维护。现在我们已经设法写出它的替代,但是用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,如果我跑这bar.exe新libfoo.so,该公司报告的undefined symbols错误。通过nm这两个libfoo.so,我可以在旧版本中找到这些符号,但不能在新版本中找到。这些符号类似于_ZSt4cerr,这是一个C++ lib损坏的名称(虽然它是由--static-libgcc提供的),当然新的libfoo.so也不包含这些类型的符号。

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

我该如何实施?

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

+0

为什么它没有与新库运行?你会得到什么样的错误信息? – 2010-03-03 12:31:44

+0

他没有收到错误消息。他正在修理一些没有损坏的东西,只是大声地批评。 – 2010-03-03 12:57:58

+0

请参阅编辑#2,我已更新我的问题。谢谢! – solotim 2010-03-03 13:12:10

回答

0

给它们相同的名字并放到不同的目录中。使用LD_LIBRARY_PATH环境。变量在任何其他目录之前用所需的库设置目录。

2

如果你建立和链接新的,你能得到它与旧的链接?这听起来像你生成了一个二进制兼容库,但只在一个方向。

+0

是的。如果我建立并链接新库,生成的bar.exe可以同时运行新旧库。但为什么? – solotim 2010-03-04 02:33:13

+0

这意味着新库的头文件依赖于比旧库更少的符号。 http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html可能会提供更多关于二进制兼容共享库的内容和方式的信息。 – Jan 2010-03-04 12:42:36

1

编辑#2帮助。

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

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

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

好运

+0

或者,更简单的答案,C .so替换C++ .so是不实际的...? :( – solotim 2010-03-04 02:39:10