編譯生成的庫為
zlibstatdebug\zlibstat.lib
和zlibstatrelease\zlibstat.lib
寫了乙個例子想測試一下,結果出現鏈結錯誤:
1>unzip.obj : error lnk2019: 無法解析的外部符號_inflateinit2_,該符號在函式_unzopencurrentfile3 中被引用
1>unzip.obj : error lnk2019: 無法解析的外部符號_inflate,該符號在函式_unzreadcurrentfile 中被引用
1>unzip.obj : error lnk2019: 無法解析的外部符號_crc32,該符號在函式_unzreadcurrentfile 中被引用
1>zip.obj : error lnk2001: 無法解析的外部符號_crc32
1>unzip.obj : error lnk2019: 無法解析的外部符號_inflateend,該符號在函式_unzclosecurrentfile 中被引用
1>zip.obj : error lnk2019: 無法解析的外部符號_get_crc_table,該符號在函式_zipopennewfileinzip4_64 中被引用
1>zip.obj : error lnk2019: 無法解析的外部符號_deflateinit2_,該符號在函式_zipopennewfileinzip4_64 中被引用
1>zip.obj : error lnk2019: 無法解析的外部符號_deflate,該符號在函式_zipwriteinfileinzip 中被引用
1>zip.obj : error lnk2019: 無法解析的外部符號_deflateend,該符號在函式_zipclosefileinzipraw64 中被引用
1>c:\test\testzlib\debug\testzlib.exe : fatal error lnk1120: 8 個無法解析的外部命令
剛開始百思不得其解,後來用lib命令檢視zlibstat.lib的符號,發現其中的函式名稱會多乙個@,比如
_get_crc_table在lib輸出的符號中為_get_crc_table@0
這個肯定是問題所在,在網上看到如下資料:
(c語言通過不同的呼叫協議來產生修飾名稱,當使用__cdecl(c呼叫協議)時,會在函式名稱前加乙個下劃線,不考慮引數和返回值。使用__fastcall函式,在函式名稱前後各加一@符號,後跟引數長度,不考慮返回值。例如extern 「c」 int __fastcall test(int n)的修飾名稱為@test@4. 對於使用標準呼叫協議(__stdcall)的函式,在函式名稱前加一下劃線,後跟引數長度,不考慮返回值。如extern 「c」 int __stdcall test (int n, int m) 的修飾名稱為
_test@8
因此再回到zibstat的工程中
發現函式的定義中有zexport:
比如(zlib.h):
zextern const z_crc_t far * zexport get_crc_table of((void));
而zexport的定義為(zconf.h):
# define zexport winapi
而winapi的定義為(windef.h)
#define winapi __stdcall
因此生成的符號當然有個@加上引數長度了
找到問題後就好解決了,修改函式中zexport為zexportva
#define zexportva winapiv----->#define winapiv __cdecl
注意需要修改標頭檔案和源**。 另外
1、發現zlibvc.def檔案在靜態庫中是不起作用的,只對動態庫的輸出符號有作用,這導致走了一點彎路
2、輸出符號的方式,在/contrib/vstudio/vc9/x86/zlibstatdebug下呼叫
>"c:\program files\microsoft visual studio 9.0\vc\bin\vcvars32.bat"
建立編譯環境,然後呼叫》dumpbin /symbols zlibstat.lib >t1.txt
即可在t1.txt檔案中看到符號了。
zlib-1.2.7.tar.gz
關於openh323在windows上編譯
剛開始不搞h323,有些不習慣,所以下了個openh323來玩玩.感覺這東西在windows上編譯可真夠煩的.我在http openh323.下了板本,發現,pwlib裡面好多東西不全.沒有pwlib,pwclib這兩個目錄,直接導致後面編譯openphone的時候出問題.於是安了個cvs,從cvs...
windows上編譯zlib 1 2 8記錄
應需求變更需要。我們要將原先專案中zlib的功能,移植到新專案上。移植完成後,編譯,出現一大堆問題,如下所示 從上圖,可以看出。是定義的介面,找不到相應的lib庫導致的。為了解決這個問題,我從以下三次入手 1 檢視 是否移植完成。2 檢視屬性是否配置ok。主要檢查以下兩項 圖1 圖2 通過比對,屬性...
zlib庫在windows系統中的編譯
zlib是提供資料壓縮之用的函式庫,此函式庫為自由軟體,由jean loup gailly與mark adler所開發,zlib使用deflate演算法,最初是為libpng函式庫所寫的,後來普遍為許多軟體所使用。1.安裝mingw5.1.4 2.安裝msys 1.0.10和msysdtk 1.0....