zoukankan      html  css  js  c++  java
  • qt5集成libcurl实现tftp和ftp的方法一:搭建环境(五篇文章)

    最近使用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:QtQt5.5.1Toolsmingw492_32 (你的安装路径)

     path变量添加“;%MINGW_HOME%in;”

    假如你的文件在D:workspacecurl-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:QtQt5.5.15.5mingw492_32in,所以我将dll文件放到这里来。测试发现,如果不进行这个操作,会有可以编译但不能运行的问题。
    最后一个配置。打开libcurl_download_html.pro文件,在TEMPLATE = app下添加一行代码:
    LIBS+="./../lib/libcurl.dll"

    4.测试

    修改mainwidow.cpp文件,其完整代码为:
    [cpp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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.   
    10. #include"./include/curl/curl.h"  
    11.   
    12.   
    13. size_t process_data(void *buffer, size_t size, size_t nmemb, void *user_p) {  
    14.     FILE *fp = (FILE *)user_p;  
    15.     size_t return_size = fwrite(buffer, size, nmemb, fp);  
    16.     qDebug()<< (char *)buffer << endl;  
    17.     return return_size;  
    18. }  
    19. int curlTest2()  
    20. {  
    21.     // 初始化libcurl  
    22.     CURLcode return_code;  
    23.     return_code = curl_global_init(CURL_GLOBAL_ALL);  
    24.     if (CURLE_OK != return_code)    {  
    25.         qDebug() << "init libcurl failed." << endl;  
    26.         return -1;  
    27.     }  
    28.   
    29.         // 获取easy handle  
    30.     CURL *easy_handle = curl_easy_init();  
    31.         if (NULL == easy_handle)  
    32.         {  
    33.             qDebug()  << "get a easy handle failed." << endl;  
    34.             curl_global_cleanup();  
    35.             return -1;  
    36.         }  
    37.         FILE *fp = fopen("d:/data.html", "ab+");  
    38.         // 设置easy handle属性  
    39.         curl_easy_setopt(easy_handle, CURLOPT_URL, "http://c.biancheng.net/cpp/html/314.html");  
    40.         curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data);  
    41.         curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, fp);  
    42.   
    43.         // 执行数据请求  
    44.         curl_easy_perform(easy_handle);  
    45.         // 释放资源  
    46.         fclose(fp);  
    47.         curl_easy_cleanup(easy_handle);  
    48.         curl_global_cleanup();  
    49. }  
    50. MainWindow::MainWindow(QWidget *parent) :  
    51.     QMainWindow(parent),  
    52.     ui(new Ui::MainWindow)  
    53. {  
    54.     int a=curlTest2();  
    55.     ui->setupUi(this);  
    56. }  
    57.   
    58. MainWindow::~MainWindow()  
    59. {  
    60.     delete ui;  
    61. }  
    编译运行,就可以看到我们这篇博客被qt5自动下载到本地了,在控制台输出下载的html文件,并且在D盘下生成一个data.html的文件。不过由于设置不完整,中文都是乱码,这个先不管了,以后再介绍怎么操作。
    示例程序下载地址:http://download.csdn.net/detail/xueyushenzhou/9554355

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

  • 相关阅读:
    本地http://localhost打不开怎么办
    C#中lock死锁实例教程
    结对-四则运算答题器-项目进度
    Forward团队-爬虫豆瓣top250项目-代码设计规范
    Forward团队-爬虫豆瓣top250项目-设计文档
    学习使用github
    Forward团队-爬虫豆瓣top250项目-团队编程项目开发环境搭建过程
    课后作业-阅读任务-阅读提问-1
    20170915-构建之法:现代软件工程-阅读笔记
    结对-四则运算答题器-设计文档
  • 原文地址:https://www.cnblogs.com/findumars/p/5612923.html
Copyright © 2011-2022 走看看