我有两个静态库,
libalgha.a
具有2个功能:func1()
和func2()
和
libbeta.a
具有2种功能:func3()
和func4()
我有一个可执行文件(mytest
)链接到这两个库。可执行文件只调用func1()
和func3()
。因此,据我所知,链接器只会将这两个函数的符号放入可执行文件中。
可执行文件在运行时加载dlopen()
(libgamma.so
),这个共享库使用libalgha.a
的func2()
函数。当运行mytest
时,我得到错误:
符号func2:所引用的符号未找到
由于Solaris 32/64位问题,我不能在libgamma.so
中包含libalgha.a
。
那么我如何将mytest
与libalgha.a
的所有符号连接起来呢?
在程序源代码中包含对func2
的引用,如:
extern void func2 ();
void (*pfunc2)() = func2;
或者,使用ld -r
将整个库链接到一个对象,并将该对象链接到可执行文件,而不是库。您可能需要也可能不需要提取对象,例如,如果以下情况不起作用:
ld -r -o libbeta.o libbeta.a
那么做
mkdir x
cd x
ar x ../libbeta.a
ld -r -o ../libbeta.o *.o
cd ..
rm -rf x
也许-u func2
会有帮助。参考手册页
不幸的是,在GNU上似乎没有--whole-archive
选项。