让我来解释一下这个场景。我们有一个传统的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++符号。这可以使一切顺利运行,但不是我真正想要的。
为什么它没有与新库运行?你会得到什么样的错误信息? – 2010-03-03 12:31:44
他没有收到错误消息。他正在修理一些没有损坏的东西,只是大声地批评。 – 2010-03-03 12:57:58
请参阅编辑#2,我已更新我的问题。谢谢! – solotim 2010-03-03 13:12:10