日期:2014-05-16  浏览次数:20681 次

关于动态库.so和静态库.a的问题
我现在编译的A.so库中使用到了B.a库中的函数,生产A.so过程没有问题。现在需要编译C.c程序,需要A.so库,如果C.c文件中没有调用   B.a中的函数那么编译过程中会出现提示A.so中某个函数没有定义,这个函数其实是在B.a中定义的,但是如果C.c中调用了B.a的函数就不会出这个问题了,求大虾帮助。

------解决方案--------------------
你没有加载so 库把?make file ne?
------解决方案--------------------
楼主的描述不准确,
是不是说:
当c.c没调用B.a中的函数时,你在编译时就没有添加-lB 呢?
当C.c中调用了B.a中的函数时,你在编译时就会添加上-lB,,,所以编译没问题呢?

告诉你是为什么,
因为你在用B.a生成A.so时,,B.a本身并没有被编译进A.so中,, 不信你可以用nm -u A.so查看下A.so中未定义的符号是不是就是B.a中的函数.
所以当你在C.c中调用了B.a中函数时,你会在编译时加上-lB,,,所以能成功.
而你没加-lB时,就不会成功.因为B.a中的函数确实在A.so中未定义.
这是因为默认情况下gcc在链接时会去除未使用的函数,包括生成动态库时(没有运行程序直接使用).

要想让A.so将B.a完全包含进去的解决方法:
假设A.so的.c文件只有a.c的话.
gcc -shared -fpic -Wl,--whole-archive libB.a -Wl,--no-whole-archive a.c -o libA.so 
这样不管你使用不使用B.a中函数,在编译C.c时,都不用指定-lB了.问题也就解决了.
你可以再用nm --defined-only libA.so看的话,,发现B.a的函数都在libA.so中定义了...