聊聊filezilla3 编译
filezilla 是个优秀的工具。代码是公开的。都可以下载。学习一个项目,最好的方式是调试。要想调试filezilla。首先要解决的是编译问题。
filezilla 编译不是很简单吗?确实。官方有编译文档。官方的编译时以msys2工具使用mingw编译器来编译的。编译出来的程序怎么调试呢。使用mingw来调试吗。不太会。
同时具有代码管理和调试,功能强大的IDE,我首推vs,虽然它越来越大。但好用。因此我的目标就是使用vs编译和调试filezilla.
filezilla使用c++14的特性。我使用vs2019编译。
网络上也有一些文章说教怎么用vs来编译filezilla,奈何filezilla版本低,vs版本低。依赖库发生了改变。而且filezilla 3.7.2源码内有vs工程了。大致思路相同。
下面简述我是如何编译filezilla。
filezille 编译依赖项参考 https://wiki.filezilla-project.org/Client_Compile
filezille 在windows 平台编译参考 https://wiki.filezilla-project.org/Compiling_FileZilla_3_under_Windows
使用msys2工具,执行pacman -Syu命令时,遇到过无法打开 ***.pkg.tar.xz-sig。是参考以下链接解决的
https://blog.csdn.net/xfijun/article/details/107810097
另外msys2下载源码慢的问题,可以在 msys64\etc\pacman.d目录下的,添加新镜像链接地址 mirrorlist.mingw32, mirrorlist.mingw64 以及 mirrorlist.msys 。把新镜像地址放第一个。
编译32位使用需要打开 mingw32.exe, 有一些./configure 配置选项 有--build选项,将 x86_64-w64-mingw32 改成 i686-w64-mingw32。
使用mingw32.exe 下载代码 gmp-6.2.1.tar.xz,gnutls-3.7.2.tar.xz,nettle-3.7.2.tar.gz,sqlite-autoconf-3360000.tar.gz。编译这几个库。gnutls放最后编译。
编译完成以后将msys安装目录\home\Administrator 目录下将prefix目录拷贝到一个新文件夹下。比如E:\Depands.
使用svn 下载 filezilla3源码 libfilezilla版本0.28,wxwdgets3.1.5。svn 下载 wxwdgets3.1.5 要使用递归下载wxwdgets3.1.5下所以的东西。不然会缺东西。
使用vs2019 打开 wxwdgets3.1.5目录\build\msw 下的 wx_vc16.sln 工程.编译release 32位。输出目录在 wxWidgets-3.1.5目录\lib\vc_lib下
接下来就是编译libfilezilla工程文件。然而libfilezilla缺少一个文件。这个名字叫 Dependencies.props.example。在filezilla源码目录\src目录下,和工程文件sln文件。同一目录下。
拷贝一份文件到libfilezilla工程目录。去掉libfilezilla 和 wxWidgets相关配置。设置gmp_include nettle_include nettle_lib gnutls_include gnutls_lib。这几个头文件和引用库都在 E:\Depands\prefix
prefix目录下有include文件和lib文件夹。设置好以后就可以编译libfilezilla文件了
现在来编译filezilla文件。
将filezilla源代码目录\src下的 Dependencies.props.example文件重命名为 Dependencies.props。
打开 Dependencies.props文件。相比较与libfilezilla下的 Dependencies.props文件。filezilla 下的 Dependencies.props 多个两个配置项。一个是libfilezilla,一个是wxWdgets项目。
libfilezilla头文件包含目录在 libfilezilla源码目录\lib 。lib目录默认在 libfilezilla源码目录\lib\编译项目录 编译项目录依据编译选项。如static_release 32位,目录就是win32_static_release 。 类似。编译完看目录就明白了
wxWdigets 头文件包含两部分,一个wx目录,一个wsvc目录。位置在wxWdigets源码目录\include;wxWdigets源码目录\include\msvc。lib目录在 wxWidgets源码目录\lib\vc_lib。其他的头文件目录设置到E:\Depands\prefix\include下相对应的目录。lib库设置位 E:\Depands\prefix\lib。
配置好以后就可以打开filezilla项目了。因为filezilla默认只编译64位的程序。没有32位的配置。如果要编译32位的filezilla。需要创建一个32位编译配置。从64位复制一份。然后调整编译选项。可以选择release,所有平台,对比32和64差异,进行修正。主要的改动,一个是C++标准需要14以上。预编译的处理。除了filezilla项目需要,其他项目如commonui 和 engine都不需要预编译头。另外设置预编译宏PACKAGE_VERSION="3.45.1.0" 到 commonui 和 engine 以及filezilla工程。否则会报告错误。
这样应该能编译过去了。但是运行会报错误。提示无法定位 nettle_aes_encrypt。查了资料后。说mingw编译出来的dll.a文件无法当作.lib文件使用。编译方式有差异。用pexplore程序查看libnettle-8.dll文件,发现导出函数是 _nettle_aes_encrypt。多了个下划线。
下载工具 pexports.exe。在 https://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/pexports-0.47/ 下载文件 pexports-0.47-mingw32-bin.tar.xz 。解压出来pexports.exe.随便放到一个目录。在环境变量PATH后面追加这个目录。
在开始找到vs2019文件夹,下拉列表中找到 x86 Native Tools Command Prompt for VS 2019后,打开。
切换到目录E:\Depands\prefix\lib。依次导出 libsqlite3-0.dll 、libnettle-8.dll、libhogweed-6.dll、libgnutls-30.dll
libgmp-10.dll 的导出文件。例如 pexports.exe libsqlite3-0.dll > libsqlite3-0.def
再依次导出以上文件的静态lib文件。使用vs 自带命令 lib 。如lib /def:libsqlite3-0.lib
返回vs工程。在filezilla 链接器 输入项 右侧 附加依赖项中 将原来dll.a改成对应的lib名字。如 sqlite.dll.a 修改成libsqlite3-0.lib。修改完之后再编译。运行。报错,提示找不到资源文件。
在filezilla源码目录\src\interface 下找到resource文件夹,拷贝到filezilla.exe所在目录。然后就可以运行了。
但是现在有一点问题。工具栏显示不正常。只有很窄的一部分。移动到上面也有提示。在filezilla工程里,找到toolbar.cpp,有代码如下
1 int style = wxTB_FLAT | wxTB_HORIZONTAL | wxTB_NODIVIDER; 2 #ifdef __WXMSW__ 3 style |= wxTB_NOICONS; 4 #endif 5 if (!toolbar->Create(pMainFrame, XRCID("ID_TOOLBAR"), wxDefaultPosition, wxDefaultSize, style)){ 6 delete toolbar; 7 return nullptr; 8 }
这个 wxTB_NOICONS 标记就是设置toolbar 没图标。为什么会这样。不太清楚。这个是wxWdigets项目的。windows下编译 __WXMSW__ 肯定会被设置。用msys2编译打包出来的没有这样的问题。不太熟悉configure 是怎么设置的。有知道的底下留言。总之 第三行注掉就可以了。
另外一个问题就是没有版本信息。filezilla 使用了filezilla.rc的资源文件。这个文件在 filezilla源码目录\src\interface\resource 文件夹内。文件内容如下。
1 #define wxUSE_NO_MANIFEST 1 2 #ifdef GNU_WINDRES 3 1 24 "windows_manifest.xml" 4 #endif 5 6 appicon ICON "FileZilla.ico" 7 8 #define APSTUDIO_READONLY_SYMBOLS 9 #include <wx/msw/wx.rc> 10 #undef APSTUDIO_READONLY_SYMBOLS 11 12 #ifdef HAS_VERSIONRC 14 #include "version.rc" 15 #endif
前面这些东西不是很懂。后面有个宏来控制 要不要包含version.rc。我尝试过filezilla项目预编译宏中添加HAS_VERSION 定义,移除filezilla.rc,然后在添加,似乎不起效果。不知道怎么处理。最后把条件编译去掉。让始终加载version.rc。然后在同级resource目录将version.rc.in改成version.rc。然后在vs工程中重新加载filezilla.rc。然后vs就报错了。说不能识别字符 0x40。 version.rc内容如下
1 VS_VERSION_INFO VERSIONINFO 2 FILEVERSION @PACKAGE_VERSION_MAJOR@,@PACKAGE_VERSION_MINOR@,@PACKAGE_VERSION_MICRO@,@PACKAGE_VERSION_NANO@ 3 PRODUCTVERSION @PACKAGE_VERSION_MAJOR@,@PACKAGE_VERSION_MINOR@,@PACKAGE_VERSION_MICRO@,@PACKAGE_VERSION_NANO@ 4 FILEFLAGSMASK 0x17L 5 FILEFLAGS 0x0L 6 FILEOS 0x4L 7 FILETYPE 0x1L 8 FILESUBTYPE 0x0L 9 BEGIN 10 BLOCK "StringFileInfo" 11 BEGIN 12 BLOCK "000004b0" 13 BEGIN 14 VALUE "Comments", "Version @PACKAGE_VERSION@" 15 VALUE "CompanyName", "FileZilla Project" 16 VALUE "FileDescription", "FileZilla FTP Client" 17 VALUE "FileVersion", "@PACKAGE_VERSION_MAJOR@, @PACKAGE_VERSION_MINOR@, @PACKAGE_VERSION_MICRO@, @PACKAGE_VERSION_NANO@" 18 VALUE "InternalName", "FileZilla 3" 19 VALUE "LegalCopyright", "Copyright (C) 2006-2021" 20 VALUE "OriginalFilename", "filezilla.exe" 21 VALUE "ProductName", "FileZilla" 22 VALUE "ProductVersion", "@PACKAGE_VERSION_MAJOR@, @PACKAGE_VERSION_MINOR@, @PACKAGE_VERSION_MICRO@, @PACKAGE_VERSION_NANO@" 23 END 24 END 25 BLOCK "VarFileInfo" 26 BEGIN 27 VALUE "Translation", 0x0, 1200 28 END 29 END
跟这些宏定义有关系。@PACKAGE_VERSION@ 替换位 3.54.1.0 @PACKAGE_VERSION_MAJOR@ 替换位 3
@PACKAGE_VERSION_MINOR@ 替换位 54。@PACKAGE_VERSION_MICRO@ 替换为 1。@PACKAGE_VERSION_NANO@ 替换为0.
然后就可以运行了。基本上也没什么大问题了。
如果你遇到其他问题,可以留言交流以下。
浙公网安备 33010602011771号