ar crvs liba.a liba1.a liba2.a
gcc -shared -o liban.so an.c liba.a
一般情况下,只有动态库中使用到的符号,才会从静态库导出,导出的是包含该符号的整个目标文件。
如何解决静态库中符号无法导出的问题:
1)在动态库中调用
2)将静态库提取出所有目标文件,然后编译动态库
3)连接选项,控制全部导出 -Wl,--whole-archive -Wl,--no-whole-archive 选项之间的静态库符号全部导出。
实例:
源文件 a1.c、a2.c、an.c、an_call.c 如下,构成:目标文件a1.o、a2.o; 静态库文件 liba.a; 动态库文件 liban.so、liban_call.so、liban_opt.so;
a1.c:

a2.c:

an.c:

an_call.c:

a1.o、a2.o:

liba.a:

liban.so:

liban_call.so:

liban_opt.so:

静态库符号无法导出问题及解决方法
博客介绍了静态库符号导出规则,一般只有动态库中使用到的符号才会从静态库导出。同时给出解决静态库中符号无法导出的方法,包括在动态库中调用、提取目标文件编译动态库、使用连接选项控制全部导出,并给出相关实例。
2404





