vs2008編譯FileZilla客戶端源碼
下載FileZilla客戶端源碼,下載地址https://download.filezilla-project.org/。
FileZilla客戶端解決方案包含3個工程,分別是:
engine,核心服務,編譯后在lib文件夾下生成engine_unicode.lib,依賴4個庫wxWidgets、GnuTLS、sqlite3、GNU IDN Library - Libidn。
FileZilla,界面程序,編譯后生成exe文件,依賴4個庫wxWidgets、GnuTLS、sqlite3、GNU IDN Library - Libidn。
tinyxml,一個輕量級的開源xml解析器,編譯后生成tinyxml.lib,關於tinyxml的用法,查看我的另外一篇文章http://www.cnblogs.com/hgwang/p/5833638.html。
本文介紹一下FileZilla客戶端release編譯方法(debug類似)。
1 編譯依賴庫wxWidgets、GnuTLS、sqlite3、GNU IDN Library - Libidn
FileZilla的3個工程全部都是unicode編碼,以下4個依賴庫也應當使用unicode編譯。
1.1 GUI界面庫wxWidgets
wxWidgets編譯比較復雜,查看我的另外一篇文章,http://www.cnblogs.com/hgwang/p/6163989.html。
1.2 GnuTLS
GnuTLS 是一個安全通訊庫,實現了 SSL、TLS 和 DTLS 協議和相關技術。提供了簡單的 C 語言編程接口用來訪問這些安全通訊協議,提供解析和讀寫 X.509、PKCS #12、OpenPGP 和其他相關結構。特點是可移植性和高效。下載地址http://josefsson.org/gnutls4win/,安裝文件內帶有source code,默認為不安裝。但這里並不需要。用vs2008 command prompt進入GnuTLS-2.10.1\bin目錄,輸入lib /def:libgnutls-26.def,將def文件導出成lib。將頭文件和生成的lib路徑加入filezilla工程屬性。
1.3 sqlite3
下載sqlite3源文件,https://www.sqlite.org/。編譯后加入頭文件和lib路徑。
1. 4 下載GNU IDN Library - Libidn
下載地址。編譯windows文件夾下的項目,將windows include文件夾下的內容拷貝到lib文件夾中,加入頭文件引用。
也可以用libidn-1.27\windows下的工程進行編譯,但推薦直接使用lib文件夾自帶的lib和dll。我用libidn-1.27\windows下的工程編譯lib,后經dumpbin /exports libidn.lib測試,沒有導出任何函數。此問題不在本章范圍內,后續再研究。
2 編譯 engine
engine工程屬性->C/C++->General->Additional Include Directories,包含以下文件路徑(需要自行修改)
E:\codeEnvir\sdk\libidn-1.27\lib E:\codeEnvir\sdk\SQlite3 E:\codeEnvir\sdk\GnuTLS-2.10.1\include $(WXWIN)\lib\vc_lib\realease-unicode\mswu $(WXWIN)\include . ../include/
WXWIN是wxWidgets路徑的系統變量,在http://www.cnblogs.com/hgwang/p/6163989.html有介紹。
engine工程屬性->Librarian->General->Additional Dependencies,包含以下lib文件:
wxzlib.lib wxtiff.lib wxregexu.lib wxpng.lib wxmsw28u.lib wxjpeg.lib wxexpat.lib libgnutls-26.lib sqlite3.lib libidn.lib
engine工程屬性->Librarian->General->Additional Library Directories,包含以下lib文件路徑:
E:\codeEnvir\sdk\libidn-1.27\windows\lib E:\codeEnvir\sdk\SQlite3\Release E:\codeEnvir\sdk\GnuTLS-2.10.1\lib E:\codeEnvir\sdk\wxMSW-2.8.12\lib\vc_lib\realease-unicode
其中,E:\codeEnvir\sdk\wxMSW-2.8.12\lib\vc_lib\realease-unicode,release-unicode是我自己添加的文件夾,包含了wxWidgets原本生成在vc_lib下的release+unicode的lib文件。
編譯engine工程,在filezilla-3.6.0.1\src\lib文件夾下生成engine_unicode.lib。
3 編譯FileZilla
仿照engine的配置FileZilla工程,此外,由於FileZilla使用wxWidgets的資源編輯器而非vs2008的資源編輯器,應配置資源屬性,如下:
FileZilla工程屬性->Resources->Additional Include Directories,加入
$(WXWIN)\lib\vc_lib\realease-unicode\mswu
$(WXWIN)\include
4 編譯調錯
1:編譯CAskSavePasswordDialog::Run出錯解決方法:
編譯FileZilla工程,報錯誤
1>quickconnectbar.obj : error LNK2001: unresolved external symbol "public: static bool __cdecl CAskSavePasswordDialog::Run(class wxWindow *)" (?Run@CAskSavePasswordDialog@@SA_NPAVwxWindow@@@Z)
unresolved external symbol CAskSavePasswordDialog::Run。經對比,發現FileZilla工程缺少CAskSavePasswordDialog的h和cpp文件,加入 AskSavePasswordDialog的h和cpp文件。
2:運行提示缺少libidn.dll
啟動調試,提示缺少libidn.dll。將libidn-1.27\windows\lib下的libidn.dll拷貝到filezilla-3.6.0.1\src\bin。
3:運行提示找不到fzsftp.exe
提示沒有找到fzsftp.exe文件。該文件不在FileZilla的客戶端源碼內,從FileZilla官網下載客戶端安裝包,解壓后將fzsftp.exe拷貝到filezilla-3.6.0.1\src\bin(忽略該問題也可以調試)。
4:提示找不到resources資源文件
右鍵我的電腦->高級系統設置->環境變量->系統變量,新建系統變量“FZ_DATADIR”,路徑為src同目錄的interface文件夾,或者filezilla安裝位置的資源文件夾。
再次啟動調試,OK!
調試界面如下:
編譯FileZilla客戶端比編譯服務端復雜很多,客戶端的依賴庫,除了Tinyxml和sqlite外,別的都沒有接觸過。特別是wxWidgets,看了一些外文文章,才曉得編譯和資源引用方法。比如在resources內加入wxWidgets引用等。