自己的exe调用ffmpeg动态库提示函数A未定义的引用

henzhuanxin 2019-01-07 11:37:54
开发环境是x86_64, linux-ubuntu18.04, 在ffmpeg的源码里添加了一个函数接口A,函数声明在avcodec.h(供可执行文件调用的头文件),定义在utils.c中,重新编译ffmpeg成功后,使用nm -D命令查看新生成的动态库libavcodec.so ,发现没有找到函数A的符号,另外使用readelf -s libavcodec.so | grep A 发现该符号的bind标识(字段)为LOCAL,其他正常外部接口符号的bind都是global,所以我想知道为何会有这个不同?
另外提供一些其他信息: 使用nm -l 查看utils.o,能够找到符号A 并且显示的标识是T,我就认为该对象文件内正确包含了函数A的定义,静态库可以理解为对象文件的串联,且可以查到符号A的标识为T,但是为何单单动态库中没有正确包含函数A呢??
...全文
366 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Geek_sun 2021-08-16
  • 打赏
  • 举报
回复

非常感谢,被这个问题卡了一个星期,终于解决了!!!谢谢!

henzhuanxin 2019-01-07
  • 打赏
  • 举报
回复
现在看来问题就出在了为何动态库中该函数符号的bind类型是local而不是global,一直没有找到这个是在哪里设置或者定义的
henzhuanxin 2019-01-07
  • 打赏
  • 举报
回复
引用 6 楼 羽飞 的回复:
[quote=引用 5 楼 henzhuanxin 的回复:] [quote=引用 4 楼 羽飞 的回复:] 解决后记得回来更新,告诉我们解决方法
现在是能够正常调用新接口了,原因在于函数命名...,ffmpeg的函数接口通常是av_xxx_xxx或者avxxx_xxx这种,我之前写的函数名字不符合这个规范,所以应该是ffmpeg对函数命名做了这种类似目录层级一样的限制吧,具体限制做法还不知晓,请问能否解惑?[/quote] 这个我也不知道,没有遇到过类似的问题。网上搜了一下,这几个链接可以解决疑问,不过还是需要你自己确认ffmpeg使用的哪种方法: https://blog.csdn.net/yu704645129/article/details/53171315 http://gcc.gnu.org/wiki/Visibility http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_25.html https://blog.csdn.net/zdragon2002/article/details/6061962 [/quote] 学习了
羽飞 2019-01-07
  • 打赏
  • 举报
回复
引用 5 楼 henzhuanxin 的回复:
[quote=引用 4 楼 羽飞 的回复:]
解决后记得回来更新,告诉我们解决方法

现在是能够正常调用新接口了,原因在于函数命名...,ffmpeg的函数接口通常是av_xxx_xxx或者avxxx_xxx这种,我之前写的函数名字不符合这个规范,所以应该是ffmpeg对函数命名做了这种类似目录层级一样的限制吧,具体限制做法还不知晓,请问能否解惑?[/quote]
这个我也不知道,没有遇到过类似的问题。网上搜了一下,这几个链接可以解决疑问,不过还是需要你自己确认ffmpeg使用的哪种方法:
https://blog.csdn.net/yu704645129/article/details/53171315
http://gcc.gnu.org/wiki/Visibility
http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_25.html
https://blog.csdn.net/zdragon2002/article/details/6061962
henzhuanxin 2019-01-07
  • 打赏
  • 举报
回复
引用 4 楼 羽飞 的回复:
解决后记得回来更新,告诉我们解决方法
现在是能够正常调用新接口了,原因在于函数命名...,ffmpeg的函数接口通常是av_xxx_xxx或者avxxx_xxx这种,我之前写的函数名字不符合这个规范,所以应该是ffmpeg对函数命名做了这种类似目录层级一样的限制吧,具体限制做法还不知晓,请问能否解惑?
羽飞 2019-01-07
  • 打赏
  • 举报
回复
解决后记得回来更新,告诉我们解决方法
henzhuanxin 2019-01-07
  • 打赏
  • 举报
回复
引用 2 楼 羽飞 的回复:
问题很奇怪,ffmpeg本来的代码里面应该有一些可以正常引用的函数,按照他们定义的函数复制一个,不同的名字试试能不能正常用? 这个库是dlopen的吗?如果是的,dlopen的参数是什么?
不是采用dlopen调用的,我是直接加的头文件然后利用gcc里面的-l + .so的方式引用动态库的;另外如果我复制一个不同名字的函数,新生成的动态库也是包含这个新的动态符号的,我目前暂时继续按照这个思路看看能不能解决问题
羽飞 2019-01-07
  • 打赏
  • 举报
回复
问题很奇怪,ffmpeg本来的代码里面应该有一些可以正常引用的函数,按照他们定义的函数复制一个,不同的名字试试能不能正常用?
这个库是dlopen的吗?如果是的,dlopen的参数是什么?

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧