1 前言
最近遇到几个Ftp需求,想使用Qt官方的Ftp试试,就打算自己编译QFtp,开始以为很复杂,其实没啥难度!三两下就搞定了!下面看具体步骤
2 克隆QFtp源码
从 GitHub 下载 QFtp:
或者使用命令下载 :
git clone https://github.com/qtproject/qtftp
公众号:Qt实战,各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。
公众号:Qt入门和进阶,专门介绍Qt/C++相关知识点学习,帮助Qt开发者更好的深入学习Qt。多位Qt元婴期大神,一步步带你从入门到进阶,走上财务自由之路。
官方店:https://shop114595942.taobao.com//
3 编译源码
首先由qtcreate打开根目录下的pro,项目里面有三个可以直接看到的项目
如上图能看到 examples、src、tests
我们只编译第二个 src
然后修改 src\qftp\qftp.pro 中的
CONFIG += static
CONFIG -= shared
改为
CONFIG -= static
CONFIG += shared
MSVC 修改为
CONFIG += staticlib
CONFIG += shared
生成.lib和.prl
然后开始编译,编译完成后会在构建目录\lib\目录下生给予成我们需要的动态库静态库文件。
4 编译错误缺少perl解决
在编译期间可能会报错Perl错误,此时需要安装perl
我们可以在 Perl 的官网下载对应平台的安装包: https://www.perl.org/get.html
Window 安装 Perl:
Perl 在 Window 平台上有 ActiveStatePerl 和 Strawberry Perl 编译器。
ActiveState Perl和 Strawberry Perl最大的区别是 Strawberry Perl 里面有多包含一些 CPAN 里的模块, 所以Strawberry Perl 下载的安装文件有 80多M, 而ActiveState Perl 只有20M 左右。
我们这里使用了 Strawberry Perl (其实ActiveState Perl足够了)
Strawberry 安装包链接: http://strawberryperl.com
5 部署编译好的库
-
将动态库(bin/*.dll文件)拷贝至xxxx\Qt5.12.10\5.12.10\mingw73_32\bin目录下
-
将静态库(lib/*.a文件)及 lib/*.prl 文件 拷贝至xxx\Qt5.12.10\5.12.10\mingw73_32\lib目录下
-
将构建目录下**/include/** 目录下的 QtFtp 文件夹拷贝至xxxx\Qt5.12.10\5.12.10\mingw73_32\include目录下
QtFtp目录内容如下:
后面我发现,上面生成的qftp.h 和 qurlinfo.h 是不对的,必须拿到src目录下的头文件才是真正的头文件,赋值替换即可 -
将构建目录下文件 \mkspecs\modules-inst*qt_lib_ftp.pri 和 qt_lib_ftp_private.pri* 拷贝至xxx\Qt5.12.10\5.12.10\mingw73_32\mkspecs\modules目录
6 使用编译好的库
在项目的 .pro文件 添加
QT += ftp
如果不能识别,就手动加入dll链接库,例如:(一般用不到!!!)
LIBS+="xxx/Qt5.12.10/5.12.10/mingw73_32/bin/Qt5Ftp.dll"
7 MSVC2019编译QFtp补充
更新时间:2021年10月9日 15:49:50
7.1 编译不出dll解决方案
今天用MSVC2019,Qt5.12.11来编译QFtp源码时,发现编译不出 *.dll, 百度一番基本无果,后面终于被我编译出来了,下面看详细步骤讲解。
编译QFtp只需要编译src目录即可, 所以首先注释掉SUBDIRS子目录中的例子和测试程序,如下图:
然后修改一下 src\qftp 下的“qftp.h”文件:
#include <QFtp/qurlinfo.h>
改为
#include <qurlinfo.h>
根据网上的说法只需要更改src目录中的qftp.pro中的CONFIG即可,如下:
打开 qtftp.pro,将默认配置:
CONFIG += static
CONFIG -= shared
改为:
CONFIG += staticlib
CONFIG += shared
网上的说法是这样更改后,既能生成 *.dll 的同时也会生成 *.lib。但是我这样更改后发现是无法生成*.dll文件的,也就是Qt5Ftp.dll 文件,如下图:
然后编译后的lib文件夹如下:
可以看到是没有dll文件出来的,只有lib和prl, 所以这种改法是有问题,而我自己摸索得编译方式是:
首先更改CONFIG为
CONFIG += static
CONFIG -= shared
改为
CONFIG -= static
CONFIG += shared
然后进行编译,此时你会发现,dll编译出来了,但是没有lib文件了,如下图:
所以还需要再改一次CONFIG标记,重新清除,然后qmake,构建即可,将CONFIG更改为上面的
CONFIG += staticlib
CONFIG += shared
重新编译后,如下图:(切记更改CONFIG后,一定要清除,可以不qmake,必须要清除原有的配置文件,否则不生效)
这样折腾完成之后会在 lib 文件夹下生成 *.lib、*.dll、*.prl 文件。
- 将 Qt5Ftpd.lib、Qt5Ftp.lib、Qt5Ftpd.prl、Qt5Ftp.prl 拷贝至 D:\Qt\Qt5.12.11\5.12.11\msvc2017\lib。
- 将 Qt5Ftpd.dll、Qt5Ftp.dll 拷贝至 D:\Qt\Qt5.12.11\5.12.11\msvc2017\bin。
- 将 qftp.h、qurlinfo.h 拷贝至 D:\Qt\Qt5.12.11\5.12.11\msvc2017\include\QtNetwork,并新建一个名为 QFtp 的文件(没有后缀名),然后用本写入 #include “qftp.h”。(qftp.h一定要改成修改)
完成之后,就可以使用 QFtp 了。
例如,如果要连接并登录到 FTP 服务器,这是简单的实现:
#include <QFtp>
// ...
QFtp *ftp = new QFtp(parent);
ftp->connectToHost("192.168.***.***", 21); // 主机:192.168.***.*** 端口号:21
ftp->login("wang", "123456"); // 用户名:wang 密码:123456
// ...