溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ffmpeg編譯的靜態(tài)鏈接庫問題

發(fā)布時間:2020-04-03 01:52:34 來源:網(wǎng)絡 閱讀:4807 作者:曾永剛 欄目:軟件技術
安裝了ffmpeg在wince編譯生成dll和.a文件,但是發(fā)現(xiàn)這個.a文件并不是像win32下面的lib文件,不能夠直接調(diào)用,如果直接調(diào)用會產(chǎn)生error LNK2001: unresolved external symbol __alloca和 error LNK2001: unresolved external symbol ___divdi3以及error LNK2001: unresolved external symbol ___umoddi3,就著三個外部庫文件調(diào)用失敗,個人認為只是不同的lib有些東西.a文件里面還是沒有的,要能夠讓你的vc能夠使用還是把它生成lib文件的好,下面結合自己的經(jīng)驗說說怎么生成lib文件,記載csdn上面免得又忘了。
在mingw中已經(jīng)有這樣的工具了叫做dlltool,但是這個沒有見過,后面在講,下面我們將一種win32的方法,如果我們已經(jīng)有一個dll(我們可以編譯ffmpeg得到),但是我們沒有l(wèi)ib文件,怎么辦?在vc下面有這樣的一個工具,叫做DUMPBIN,這個工具可以把dll導出def文件來描述dll的接口,
DUMPBIN VideoDeCoder.dll /EXPORTS /OUT:VideoDeCoder.def
我們可以在vc的bin下面找到這個文件,好,現(xiàn)在我們可以運行這個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
將所有的函數(shù)放至行首,去掉 "hint" 和 "RVA" 數(shù)據(jù),留下函數(shù)的序號 "ordinal" ,在序號前加上 "@" 符號 形成"_導出函數(shù)名@參數(shù)字節(jié)和 @序號" 此種格式(__stdcall 方式調(diào)用導出的函數(shù)符號是 "函數(shù)名稱@參數(shù)字節(jié)和").最后形成.DEF文件如下:
使用VC++的LIB工具,帶/DEF:(.def文件名) /MACHINE:IX86(80X86機器),就輸出符合VC++格式的的LIB文件了.
EXAMPLE:
LIB /DEF:avutil.def /MACHINE:IX86時帶上LIB文件鏈接;注意的是當有些動態(tài)庫DUMPBIN的只有函數(shù)名,無"@nn"的參數(shù)格式,如C++Builder寫的DLL,輸出就只有函數(shù)名符號,鏈接時就會報錯: error LNK2002:unresolved external symbol "functionname@nn"提示程序中引入的函數(shù)符號無法識別,這時只要將DEF文件中相應的函數(shù)名稱改為functionname@nn方式,重新建立 LIB,重新鏈接即可.
 
mspdb80.dll無法找到的情況
在cmd中鍵入cl執(zhí)行編譯時會出現(xiàn)mspdb80.dll無法找到的情況,是因為VC\Bin\下沒有“msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”這四個文件,解決的方法:
1>直接從Common7\IDE\下復制這四個文件到VC\Bin\下即可解決
2>添加系統(tǒng)變量(Path),這樣:我的電腦->屬性->高級->環(huán)境變量->系統(tǒng)變量,在path中添加C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;,注意結尾最后用“;”隔開!
這樣在用cl編譯就不會出現(xiàn)mspdb80.dll文件找不到的錯誤了。
 
 
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI