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下面找到这个文件,但是可能会出现一个问题,提示缺少什么库,那么可以参考http://blog.csdn.net/kv110/archive/2008/06/16/2553850.aspx,这篇文章里面说的很清楚,好,现在我们可以运行这个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"EXPORTSav_add_i  @1av_add_q  @2av_cmp_i  @3av_crc   @4av_crc04C11DB7  @5av_crc07  @6av_crc8005  @7av_crcEDB88320  @8av_crc_init  @9av_d2q   @10av_dbl2ext  @11av_dbl2int  @12av_div_i  @13av_div_q  @14av_ext2dbl  @15av_flt2int  @16av_i2int  @17av_int2dbl  @18av_int2flt  @19av_int2i  @20av_log2_i  @21av_mod_i  @22av_mul_i  @23av_mul_q  @24av_reduce  @25av_rescale  @26av_rescale_q  @27av_rescale_rnd  @28av_shr_i  @29av_sub_i  @30av_sub_q  @311ff_gcd   @32ff_log2_tab  @33ff_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,重新链接即可.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinlking/archive/2009/01/08/3734458.aspx

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值