(转)Visual Studio无法定位于动态链接库-ffmpeg

原文链接:https://blog.csdn.net/Jammg/article/details/52639936


今天用vs开发ffmpeg突然冒出一个这样的错误




由于程序用到了 avcodec 和 avutil 这两个库,而 av_frame_alloc是属于 avutil这个库的。


以下通过查询头文件,发现 av_frame_alloc 并非属于 avcodec 动态库的函数,那为什么会这样子呢?


我决定再查询一下 avcodec-57.all 和 libavcodec.dll.a,用dumpbin程序:


 
 
  1. dumpbin -exports avcodec -57.dll
  2. dumpbin -exports libavcodec.dll.a

发现av_frame_alloc 也没有在导入库 和 动态库,那么为什么编译器认定av_frame_alloc要在 avcodec这个库寻找呢?


因为程序build是成功的,我再次查看可执行文件的内容,同样dumpbin :

dumpbin -exports *.exe
 
 

可以得出以下内容:



发现,avcodec的函数跑到avutil去 ,avutil的跑到avcodec去。。。。。。。。。。。。。。。。。。。。。。。。


以前在qt平台也用过,怎么没问题,最后。。。

发现程序导入库使用了


#pragma comment(lib, "libavcodec.all.a")
 
 

...

经查实:

.dll.a文件的最初用意其实是MinGW下的DLL文件的imp-lib (Import Library),即与VC下DLL文件附带了一个引入库.lib类似。在VC下编程,当要使用DLL文件时,在开发时必须要有.lib文件才能链接通过。.dll.a文件就是这样的作用。

也就是说 ,之前qt用的是mingw,导入dll.a当然没问题了,vs使用的是msvc编译器,导入库是.lib格式的,所以问题就在这里了。

改用:

#pragma comment(lib, "avcodec.lib")
 
 

问题解决。



那么,为什么程序可以build成功,生成可执行,只是执行不了呢?

导入库里面只是存储了函数[symbol]的地址,由于dll.a在msvc下不能正常工作,所以出现了链接“错误”,但连接器是不知道的,所以连接出了这种情况。

从这里我们也知道,程序一开始执行,就首先需要将所有用到的dll的函数 转换成 函数的地址,也就是地址重定位!



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值