最近使用QT5做一个软件,要求实现tftp和ftp文件传输,使用QT5开发好UI界面等功能,突然发现QT5不直接提供tftp和ftp支持,无奈之下只好找第三方库来间接实现,根据网友的介绍,libcurl是一个比较小巧好用的网络扩展库,但问题来了,该怎么用呢?折腾了几天,终于在周五晚上别人都下班回家了,我还不甘心的情况下加班找到了解决的方法。现在整理出来,分享给大家,也给自己做个笔记。

首先介绍如何搭建使用环境,这个非常重要,下一篇介绍如何实现文件传输。这涉及到qt5、minGW和libcurl编译三方面的协同。

1.安装QT5的注意事项

安装qt5说起来非常简单,但是经常出错,有时候是装上之后运行QT creator的时候出现错误。下面介绍一个我测试过没有问题的安装方法:

首先是qt5建议安装qt5.5.0等公认的稳定性比较好的版本,不要随便找个版本就安装。推荐一个下载地址http://mirror.bit.edu.cn/qtproject/archive/qt/5.5/5.5.0/

打开这个地址,看一看到里面有很多版本,三大系统win、Linux和mac都有,win环境又分了msvc、mingw和x86与x64等多种版本,这个必须要注意。qt本身不能编译程序的,要借用VisualStudio或者gcc来完成编译。前者对应的版本就是名称中带有msvc的版本,而后者就是能够在win下运行的GCC开发工具链。如果你电脑里装了可用的VisualStudio环境,可以使用msvc版的,但是为了减少不必要的麻烦,我强烈建议只选择MinGW版本的。我选择的版本是qt-opensource-windows-x86-mingw492-5.5.0.exe  ,注意mingw版本的只有32位的。

注意在有些版本中,比如在qt5.0的安装文件中有名称中带opengl的,这种版本是在qt中集成了OpenGL,安装这种版本需要安装显卡驱动之类的,特别容易出错,强烈建议不安装。

下载后直接安装即可,还有一个需要注意的是,在安装时有下面这个个选项,在Tools下有个MinGW,强烈建议安装,后面有用。

2.编译libcurl

在编译libcurl时,可以使用其lib下的makefile文件直接编译,但是必须先配置好MinGW,这里必须保证编译器与QT5使用的一致。我首先在网上下载了一个MinGW,但是编译成功的无法使用,报告“file not recognized: File format not recognized”错误。那么最好的编译器是什么呢?就是上面说的QT安装时Tools下的MinGW。

先将其添加到环境变量中,然后调用Make编译即可。

配置环境变量的参数是,如果你不知道,请百度一下,方法和配置java等都一样的:

新建 MINGW_HOME 值为C:\Qt\Qt5.5.1\Tools\mingw492_32 (你的安装路径)

path变量添加“;%MINGW_HOME%\bin;”

假如你的文件在D:\workspace\curl-7.32.0下,那么cd过去,然后使用下面的命令编译即可:

mingw32-make -f Makefile.m32

然后等待编译完成。 编译完成之后,我们可以在curl的lib目录下看到几个文件:libcurl.a、libcurl.dll和libcurldll.a三个文件,这就是我们需要的链接库了。

3.使用

接下来我们要在qt5中添加libcurl库,并将一个html网页保存到本地,以此检测curl是否正确工作。
新建一个QT5工程,类型可以是widget,也可以是Dialog类型,这个没关系,工程名为libcurl_download_html,然后将curl下的include文件夹复制到当前工程目录下。
接下来,在当前工程的debug目录下新建一个lib文件夹,将编译好的libcurl.a、libcurl.dll和libcurldll.a三个文件放进来。
这里需要注意了,qt5默认是将编译的路径放在和libcurl_download_html同级的地方,而不是像VS一样放在其下面,嘛意思呢?请先看我的目录:下面的红框是我指定的工程目录,而其编译好的文件是在上面红框的,两者在同一级目录下。
这其实不太方面的,我们希望能像VisualC一样将debug目录放在工程下面,方法是单击左侧的“项目”,然后修改图中所示的路径即可。
 
 
完成之后,将libcurl.dll放到qt的安装目录的bin目录下,例如我的qt安装路径是C:\Qt\Qt5.5.1\5.5\mingw492_32\bin,所以我将dll文件放到这里来。测试发现,如果不进行这个操作,会有可以编译但不能运行的问题。
最后一个配置。打开libcurl_download_html.pro文件,在TEMPLATE = app下添加一行代码:
LIBS+="./../lib/libcurl.dll"

4.测试

修改mainwidow.cpp文件,其完整代码为:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <errno.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <sys/stat.h>
  8. #include<QDebug>
  9. #include"./include/curl/curl.h"
  10. size_t process_data(void *buffer, size_t size, size_t nmemb, void *user_p) {
  11. FILE *fp = (FILE *)user_p;
  12. size_t return_size = fwrite(buffer, size, nmemb, fp);
  13. qDebug()<< (char *)buffer << endl;
  14. return return_size;
  15. }
  16. int curlTest2()
  17. {
  18. // 初始化libcurl
  19. CURLcode return_code;
  20. return_code = curl_global_init(CURL_GLOBAL_ALL);
  21. if (CURLE_OK != return_code)    {
  22. qDebug() << "init libcurl failed." << endl;
  23. return -1;
  24. }
  25. // 获取easy handle
  26. CURL *easy_handle = curl_easy_init();
  27. if (NULL == easy_handle)
  28. {
  29. qDebug()  << "get a easy handle failed." << endl;
  30. curl_global_cleanup();
  31. return -1;
  32. }
  33. FILE *fp = fopen("d:/data.html", "ab+");
  34. // 设置easy handle属性
  35. curl_easy_setopt(easy_handle, CURLOPT_URL, "http://c.biancheng.net/cpp/html/314.html");
  36. curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data);
  37. curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, fp);
  38. // 执行数据请求
  39. curl_easy_perform(easy_handle);
  40. // 释放资源
  41. fclose(fp);
  42. curl_easy_cleanup(easy_handle);
  43. curl_global_cleanup();
  44. }
  45. MainWindow::MainWindow(QWidget *parent) :
  46. QMainWindow(parent),
  47. ui(new Ui::MainWindow)
  48. {
  49. int a=curlTest2();
  50. ui->setupUi(this);
  51. }
  52. MainWindow::~MainWindow()
  53. {
  54. delete ui;
  55. }

编译运行,就可以看到我们这篇博客被qt5自动下载到本地了,在控制台输出下载的html文件,并且在D盘下生成一个data.html的文件。不过由于设置不完整,中文都是乱码,这个先不管了,以后再介绍怎么操作。

示例程序下载地址:http://download.csdn.net/detail/xueyushenzhou/9554355

http://blog.csdn.net/xueyushenzhou/article/details/51702672

qt5集成libcurl实现tftp和ftp的方法一:搭建环境(五篇文章)的更多相关文章

  1. 【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.1 搭建环境

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  2. 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)

    在使用百度编辑器ueditor的时候,怎么将图片保存到另一个服务器,或者上传到ftp服务器?这个问题,估计很多使用UE的人会遇到.而且我百度过,没有找到这个问题的解决方案.那么:本篇文章就很适合你了. ...

  3. Kali学习笔记34:配置TFTP和FTP服务

    配置TFTP: 默认情况下windowsXP和2003是开启TFTP服务的 其他windows到控制面板设置好就行 kali系统也是安装了TFTP服务的:atftpd 下面是一些配置并放入一个文件 w ...

  4. TFTP 与 FTP的区别

    FTP(File Transfer Protocol,文件传输协议)协议在TCP/IP协议族中属于应用层协议,用于在远端服务器和本地客户端之间传输文件,使用TCP端口20和21进行传输.端口20用于传 ...

  5. rabbitMQ第五篇:Spring集成RabbitMQ

    前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq. 首先引入配置文件org.springframework.amqp,如下 <dependency> ...

  6. Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍

    本文主要内容: 1.FTP服务端部署---- 基于Android中SwiFTP开源软件介绍: 2.FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 : 3.使用步骤 --- 如何测试我 ...

  7. Python学习笔记【第十五篇】:Python网络编程三ftp案例练习--断点续传

    开发一个支持多用户在线的FTP程序-------------------主要是学习思路 实现功能点 1:用户登陆验证(用户名.密码) 2:实现多用户登陆 3:实现简单的cmd命令操作 4:文件的上传( ...

  8. linux中ftp的安装过程记录[运维篇]

    安装FTP的全过程记录,对于相同情况希望有所帮助.[centOS] 1.查询本机是否安装vsftpd: rpm -qa |grep vsftpd : 2.安装ftp服务 yum install vsf ...

  9. Ftp服务端安装-Linux环境

    目的 为什么要搭建FTP服务器,进入maven仓库下载Jar包时点击相应的链接进去会看到目录结构,这个就是ftp站点.可以随意的下载. 环境 Linux系统为CentOS6.5 安装步骤 查询是否已安 ...

随机推荐

  1. poj1700--贪心算法

    题意:一群人坐船过河,船只有一辆,且一次最多坐两人,时间按慢的算.求最短过河时间? 总共有两种做法可使用: 1.先让最快和次快的过去,让最快的把船开回,再让最慢和次慢的过去,让次快的把船开回.需两个来 ...

  2. leetcode Generate Parentheses python

    # 解题思路:列举出所有合法的括号匹配,使用dfs.如果左括号的数量大于右括号的数量的话,就不能产生合法的括号匹配class Solution(object): def generateParenth ...

  3. Linux简介(好!)

    Linux操作系统介绍 来源:233网校论文中心[ 2009-12-02 14:23:00 ]阅读:1作者:王长青编辑:studa20 [摘 要]文章从Unix.Minix系统的产生引出了Linux操 ...

  4. 回调函数 callback 的简单理解

    回调函数指当我执行完某一段代码之后在回过头来调用 jquery 最简单的例子 $(".className").each(function(i){alert(i)}) 她这个形参i是 ...

  5. JRainbow开发进度

    最新版本下载 http://pan.baidu.com/s/1c0GcDMg&third=15 相关信息 JRainbow的简单介绍:http://blog.csdn.net/jrainbow ...

  6. 什么是Web前端,Web前端是做什么的?

    什么是Web前端 Web前端,顾名思义是来做Web的前端的.而Web前端开发应该就是来开发基于Web前端的相关应用的或者说是来开发前端的.那么,前端又是什么呢?我们这里所说的前端泛指Web前端,也就是 ...

  7. cv2.imread BGR模式

    openCV 的cv2.imread()导入图片时是BGR通道顺序,这与Matplotlib的显示,或者读取图片的通道不同,如果需要可以转换为RGB模式,以下代码显示不同之处,但BGR在许多地方使用, ...

  8. Python自动化环境搭建

    安装配置 Eclipse + PyDev + Robotframework 集成开发环境 1.安装JDK安装目录下的jdk-7u17-windows-i586.exe文件(JAVA开发.运行环境)安装 ...

  9. 如何使Label带有链接??此法感觉有点取巧!!!

    关键代码 /**************************************************************第一行***************************** ...

  10. Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)

    Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...