ffmpeg编译的静态链接库问题

简介:



安装了ffmpeg在wince编译生成dll和.a文件,但是发现这个.a文件并不是像win32下面的lib文件,不能够直接调用,如果直接调用会产生error LNK2001: unresolved external symbol __alloca和 error LNK2001: unresolved external symbol ___divdi3以及error LNK2001: unresolved external symbol ___umoddi3,就着三个外部库文件调用失败,个人认为只是不同的lib有些东西.a文件里面还是没有的,要能够让你的vc能够使用还是把它生成lib文件的好,下面结合自己的经验说说怎么生成lib文件,记载csdn上面免得又忘了。

在mingw中已经有这样的工具了叫做dlltool,但是这个没有见过,后面在讲,下面我们将一种win32的方法,如果我们已经有一个dll(我们可以编译ffmpeg得到),但是我们没有lib文件,怎么办?在vc下面有这样的一个工具,叫做DUMPBIN,这个工具可以把dll导出def文件来描述dll的接口,
DUMPBIN VideoDeCoder.dll /EXPORTS /OUT:VideoDeCoder.def
我们可以在vc的bin下面找到这个文件,好,现在我们可以运行这个dumpbin然后我们对我们的dll进行使用,我们的dll有三个avcodec.dll、avformat.dll和avutil.dll,这样我们可以生成三个def文件,下一步就是如何将这三个dll变成lib了。这个def文件并不是一个专门lib的def文件而是有一个dll得来,我们要把它变成lib还要一些修改。
原始文件Dump of file C:\\Program Files\\FFmpeg\\avutil.dllFile
 Type: DLL  Section contains the following exports for avutil.dll
    00000000 characteristics
    49659AAD time date stamp Thu Jan 08 14:18:21 2009
        0.00 version
           1 ordinal base
          34 number of functions
          34 number of names
    ordinal hint RVA
      name
          1    0 00001C70 av_add_i
          2    1 00002850 av_add_q
          3    2 00001F10 av_cmp_i
          4    3 00003130 av_crc
          5    4 00005080 av_crc04C11DB7
          6    5 00005090 av_crc07
          7    6 00005060 av_crc8005
          8    7 00005070 av_crcEDB88320
          9    8 00003000 av_crc_init
         10    9 00002940 av_d2q
         11    A 00002AB0 av_dbl2ext
         12    B 00002E30 av_dbl2int
         13    C 00002420 av_div_i
         14    D 00002800 av_div_q
         15    E 00002D40 av_ext2dbl
         16    F 00002F30 av_flt2int
         17   10 000024D0 av_i2int
         18   11 00002C00 av_int2dbl
         19   12 00002CC0 av_int2flt
         20   13 00002480 av_int2i
         21   14 00001D30 av_log2_i
         22   15 00001FF0 av_mod_i
         23   16 00001D80 av_mul_i
         24   17 000027B0 av_mul_q
         25   18 00002510 av_reduce
         26   19 000016A0 av_rescale
         27   1A 00001980 av_rescale_q
         28   1B 000013B0 av_rescale_rnd
         29   1C 00001F60 av_shr_i
         30   1D 00001CD0 av_sub_i
         31   1E 000028C0 av_sub_q
         32   1F 00001350 ff_gcd
         33   20 00001250 ff_log2_tab
         34   21 000011D0 ff_sqrt_tab
  Summary
        1000 .bss
        1000 .data
        1000 .edata
        1000 .idata
        1000 .reloc
        3000 .text
变换后的文件:
LIBRARY "avutil"
DESCRIPTION "avutil"
EXPORTS
av_add_i  @1
av_add_q  @2
av_cmp_i  @3
av_crc   @4
av_crc04C11DB7  @5
av_crc07  @6
av_crc8005  @7
av_crcEDB88320  @8
av_crc_init  @9
av_d2q   @10
av_dbl2ext  @11
av_dbl2int  @12
av_div_i  @13
av_div_q  @14
av_ext2dbl  @15
av_flt2int  @16
av_i2int  @17
av_int2dbl  @18
av_int2flt  @19
av_int2i  @20
av_log2_i  @21
av_mod_i  @22
av_mul_i  @23
av_mul_q  @24
av_reduce  @25
av_rescale  @26
av_rescale_q  @27
av_rescale_rnd  @28
av_shr_i  @29
av_sub_i  @30
av_sub_q  @31
1ff_gcd   @32
ff_log2_tab  @33
ff_sqrt_tab  @34
将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号 形成"_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").最后形成.DEF文件如下:
使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
EXAMPLE:
LIB /DEF:avutil.def /MACHINE:IX86时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错: error LNK2002:unresolved external symbol " functionname@nn"提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为 functionname@nn方式,重新建立 LIB,重新链接即可.
 
mspdb80.dll无法找到的情况
在cmd中键入cl执行编译时会出现mspdb80.dll无法找到的情况,是因为VC\Bin\下没有“msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”这四个文件,解决的方法:
1>直接从Common7\IDE\下复制这四个文件到VC\Bin\下即可解决
2>添加系统变量(Path),这样:我的电脑->属性->高级->环境变量->系统变量,在path中添加C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;,注意结尾最后用“;”隔开!
这样在用cl编译就不会出现mspdb80.dll文件找不到的错误了。
 

本文转自 曾永刚 51CTO博客,原文链接:http://blog.51cto.com/zyg0227/325408
相关文章
|
23天前
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
35 0
|
3月前
|
Linux 编译器 数据安全/隐私保护
Windows10 使用MSYS2和VS2019编译FFmpeg源代码-测试通过
FFmpeg作为一个流媒体的整体解决方案,在很多项目中都使用了它,如果我们也需要使用FFmpeg进行开发,很多时候我们需要将源码编译成动态库或者静态库,然后将库放入到我们的项目中,这样我们就能在我们的项目中使用FFmpeg提供的接口进行开发。关于FFmpeg的介绍这里就不过多说明。
72 0
|
7月前
|
C++ Windows
FFmpeg入门及编译 3
FFmpeg入门及编译
52 0
|
7月前
|
编解码 API 开发工具
FFmpeg入门及编译 1
FFmpeg入门及编译
97 0
|
12天前
|
编解码 缓存 算法
FFmpeg开发笔记(四)FFmpeg的动态链接库介绍
FFmpeg是一个强大的多媒体处理框架,提供ffmpeg、ffplay和ffprobe工具及八个库:avcodec(编解码)、avdevice(设备输入输出)、avfilter(音视频滤镜)、avformat(格式处理)、avutil(通用工具和算法)、postproc(后期效果)、swresample(音频重采样)和swscale(视频图像转换)。这些库支持定制化开发,涵盖了从采集、编码、过滤到输出的全过程。了解详细FFmpeg开发信息,可参考《FFmpeg开发实战:从零基础到短视频上线》。
27 0
FFmpeg开发笔记(四)FFmpeg的动态链接库介绍
|
15天前
|
开发工具
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(二)
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(二)
12 0
|
7月前
|
API C语言 C++
FFmpeg入门及编译 2
FFmpeg入门及编译
80 0
|
3月前
|
编解码 Ubuntu C++
WebAssembly01--web 编译FFmpeg(WebAssembly版)库
WebAssembly01--web 编译FFmpeg(WebAssembly版)库
20 0
|
3月前
|
存储 Ubuntu 开发工具
ffmpeg笔记(二)windows下和ubuntu-16.04下ffmpeg编译
ffmpeg笔记(二)windows下和ubuntu-16.04下ffmpeg编译
|
8月前
|
算法 计算机视觉
ffmpeg的postproc库
ffmpeg的postproc库
69 0