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能找到,猜测问题出现的原因肯定是在链接的过程,链接的命令是ld,查询ld的的参数发现如下两个:
--whole-archive
For each archive mentioned on the command line af-
&nbs

当使用CMake将多个静态库编译成动态库时,可能出现找不到某些符号的问题。这通常是由于链接时只包含了实际使用的静态库符号。解决方法是利用`-Wl,--whole-archive`和`-Wl,--no-whole-archive`选项,强制链接所有静态库。在CMakeLists.txt中,将`target_link_libraries`改为包括这两个选项,确保所有静态库都被包含在动态库中。"
115096198,10535481,使用PHP扩展解决一元二次方程,"['PHP', '一元二次方程', '扩展开发']

2926

被折叠的 条评论
为什么被折叠?



