Visual Studio无法定位于动态链接库
来源:互联网 发布:mysql employees 编辑:程序博客网 时间:2024/05/22 16:55
今天用vs开发ffmpeg突然冒出一个这样的错误
由于程序用到了 avcodec 和 avutil 这两个库,而 av_frame_alloc是属于 avutil这个库的。
以下通过查询头文件,发现 av_frame_alloc 并非属于 avcodec 动态库的函数,那为什么会这样子呢?
我决定再查询一下 avcodec-57.all 和 libavcodec.dll.a,用dumpbin程序:
dumpbin -exports avcodec-57.dlldumpbin -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的函数 转换成 函数的地址,也就是地址重定位!
- Visual Studio无法定位于动态链接库
- 无法定位程序输入点于动态链接库
- 无法定位序数368于动态链接库oleaut32.dll
- 无法定位程序输入点 于动态链接库
- 无法定位序数***于动态链接库libeay32.dll
- 无法定位序数385 于动态链接库 licurl.dll
- 无法定位序数 354 于动态链接库LIB
- 无法定位序数9828于动态链接库或者exe
- 无法定位程序输入点 于动态链接库上
- 无法定位程序输入点于动态链接库kernel32
- 打开软件提示无法定位于动态链接库
- 无法定位程序输入点_except1于动态链接库
- 无法定位序数341于动态链接库于SSLEAY.DLL上
- win10无法定位程序输入点 于动态链接库无法运行软件该怎么办?
- 无法定位程序输入点于动态链接
- 无法定位序数4540于动态链接库LIBEAY32.dll上(以及其它无法定位序数的解决方案)
- 关于"无法定位程序输入点 RtlUnhandledExceptionFilter 于动态链接库"解决方法
- 无法定位程序输入点ldrlockloaderlock于动态链接库ntdll.dll上的解决办法
- 阅读感悟_之分享一些自己的学习历程和学习方法
- adb 命令
- Android Studio导入Vitamio多媒体开发框架
- 空闲时间学一个Linux命令(2)——cd命令
- shell script 学习记录
- Visual Studio无法定位于动态链接库
- 操作符重载专题-实现基本操作符重载
- Navicat连接本地MySQL
- 设置MyEclipse开发项目时使用的JDK
- 十二星座如何玩转O盟
- 机器学习之四:SVM简介
- 【转载】详解微信小程序开发教程
- 论人不地道,我只佩服TT——北漂18年(68)
- C++培训_003_数据类型_结构体_基础输入输出