选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2021-09-16
  • 更新:2021-09-17
.so 文件调用外部 .a 里面的函数会报错: so: undefined reference to, 原因及解决方法


问题产生

so的源文件 中的函数 A调用了一个函数B,并且声明为外部函数,编译成liba.so

然后使用 so 时, 在其它 .c 文件中定义了 B,并编译成静态文件libb.a, 但是在使用cmake构建,链接时还是会提示 .so: undefined reference to "B", 解决办法:

使用如下命令链接会报错undefined reference to func_b

  1. 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将两者包起来, 这种比较适用于互相调用时使用
  1. gcc -o build/two main.c build/liba.so build/libb.a
  2. gcc main.c -o build/two -Lbuild -la build/libb.a
  3. 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左边就好了。

文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-j5lk95.jpg