我有2个静态库,
libalgha.a
包含2个函数:func1()
和func2()
和
libbeta.a
包含2个函数:func3()
和func4()
我有1个与这两个库链接的可执行文件(mytest
)。可执行文件仅调用func1()
和func3()
。据我所知,链接器只会将这两个函数的符号放入可执行文件中。
可执行文件在运行时加载dlopen()
共享库(libgamma.so
),此共享库使用func2()
中的函数libalgha.a
。运行mytest
时出现错误:
符号func2:未找到引用的符号
由于Solaris 32/64位问题,我无法在libalgha.a
内包含libgamma.so
。
那么如何将mytest
与libalgha.a
的所有符号相关联?
答案 0 :(得分:1)
也许-u func2
会有所帮助。请参阅manual page。
不幸的是,GNU似乎没有--whole-archive
选项。
答案 1 :(得分:1)
在您的计划来源中添加对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