https://www.cnblogs.com/zl1991/p/9437192.html
https://cmake.org/pipermail/cmake/2016-May/063509.html
根据以上两篇文章可以找到答案,但本文倾向于定位方法。
前置知识:
(1) ld 的链接规则是 "未定义的符号往后找"
(2)链接静态库时,只会将编译时用到的符号添加进动态库,有些符号是希望动态加载,在编译的时候并未显示调用。
这时需要将静态库全部链接。
举例:打算将liba.a,libb.a,libc.a,libd.a,libe.a,libf.a六个静态库,编译成libsix.so。
CMakelist这样写:
target_link_libraries(six a b c d e f)
此时如果libd.a这个静态库中的函数没有被任何人调用,通过nm 查看libsix.so的符号表,会发现没有libd.a的函数符号。原因就是因为:链接静态库时,只会将编译时用到的符号添加进动态库,没有用到的不会添加进来,以此来缩减动态库的体积。如果在a中的c文件中调用一个libd.a的函数,就会发现libsix.so有libd.a的符号了。
在libsix.so找不到,而在libd.a能找到,猜测问题