cc静态链接:如何导入一个.a库的所有符号?

时间:2011-09-30 11:07:41

标签: compiler-construction hyperlink linker cc

我有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

那么如何将mytestlibalgha.a的所有符号相关联?

2 个答案:

答案 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