- 作者:
- 分类:知识&开发->语言->C
- 阅读:1600
- 点赞:1
- 版权:CC BY-SA 4.0
- 创建:2021-09-16
- 更新:2021-09-17
.so 文件调用外部 .a 里面的函数会报错: so: undefined reference to, 原因及解决方法
版权声明:本文为 neucrack 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接(持续更新):https://neucrack.com/p/380
原文链接(持续更新):https://neucrack.com/p/380
问题产生
so的源文件 中的函数 A调用了一个函数B,并且声明为外部函数,编译成liba.so
然后使用 so 时, 在其它 .c 文件中定义了 B,并编译成静态文件libb.a
, 但是在使用cmake
构建,链接时还是会提示 .so: undefined reference to "B"
, 解决办法:
使用如下命令链接会报错undefined reference to func_b
gcc main.c -o build/two build/libb.a -Lbuild -la
原因以及解决方法
原因是: 编译时, 参数位置,调用者需要在定义者的左边
解决:
- 不使用
-L搜索路径 + -la
的方式, 直接 写so
的路径和完整文件名 - 这里把 调用者
build/liba.so
放到函数定义者build/libb.a
左边即可 - 或者使用
-Wl,--start-group
-Wl,--end-group
将两者包起来, 这种比较适用于互相调用时使用
gcc -o build/two main.c build/liba.so build/libb.a
gcc main.c -o build/two -Lbuild -la build/libb.a
gcc main.c -o build/two -Lbuild -Wl,--start-group build/libb.a -la -Wl,--end-group
两个 .a 文件同样也适用, 调用者 .a 要在 被调用的 .a 左边。
比如 opencv 编译时遇到 opencv4/3rdparty/libippiw.a(iw_core.c.o) undefined reference to ippicvsRound_64f
,将 libippiw.a
放到libippicv.a
左边就好了。