C++ 如何在Windows上静态链接到Qt中的libcUrl?

C++ 如何在Windows上静态链接到Qt中的libcUrl?,c++,windows,qt,curl,C++,Windows,Qt,Curl,我已经试着按照我能在网上找到的所有指南去做了,我非常接近,但是被卡住了。项目构建并运行。然而,它立即崩溃。 我使用的是qtcreator3.5.1和qt5.5.1,编译器是mingw4.9.2 32位 我从中下载的cUrl库是Win32 GenericWin32 7zip 7.45.0二进制SSL SSH Viktor Szakáts 我已经在.pro文件中添加了curl头的路径INCLUDEPATH+=C:\Lib\C\curl-7.45.0-win32-mingw\include 此外,我还

我已经试着按照我能在网上找到的所有指南去做了,我非常接近,但是被卡住了。项目构建并运行。然而,它立即崩溃。 我使用的是
qtcreator3.5.1
qt5.5.1
,编译器是
mingw4.9.2 32位

我从中下载的cUrl库是Win32 Generic
Win32 7zip 7.45.0二进制SSL SSH Viktor Szakáts

我已经在.pro文件中添加了curl头的路径
INCLUDEPATH+=C:\Lib\C\curl-7.45.0-win32-mingw\include

此外,我还右键单击了该项目,单击了“添加库”,选择了“系统库”,仅选择了Windows并设置为静态链接,并添加了
libcurl.a
libcurldll.a
,它们都位于编译器的lib目录
C:\Qt\Tools\mingw492\u 32\lib
。此步骤将
win32:LIBS+=-lcurl
win32:LIBS+=-lcurldll
添加到.pro文件中

main.cpp:

#include "mainwindow.h"
#include <QApplication>
#include <curl/curl.h>

int main(int argc, char *argv[]) {
    CURLcode result = curl_global_init(CURL_GLOBAL_WIN32);
    QApplication a(argc, argv);
    MainWindow w;
    w.show();    
    auto retVal = a.exec();
    curl_global_cleanup();
    return retVal;
}
#包括“mainwindow.h”
#包括
#包括
int main(int argc,char*argv[]){
CURLcode result=curl\u global\u init(curl\u global\u WIN32);
质量保证申请a(argc、argv);
主窗口w;
w、 show();
自动检索=a.exec();
curl_global_cleanup();
返回返回;
}
坠机的原因是什么


注意:在任何代码中都没有cUrl的其他用途(它只是一个简单的应用程序)。

下载cUrl for Windows(64位):

或者,对于32位:

首先,您必须将curl中的文件夹放入qt中的文件夹

这些是:

“包括”, “lib”, “垃圾桶”

进入(我使用版本5.14.2和64位)

F:/Qt/5.14.2/mingw73_64/lib,F:/Qt/5.14.2/mingw73_64/include, F:/Qt/5.14.2/mingw73_64/bin

然后从项目中转到.pro文件并添加以下行:

LIBS += -LF:/Qt/5.14.2/mingw73_64/lib -lcurl

注意-您必须选择QT安装的lib目录的路径

现在,您可以使用以下代码进行测试:

...
#include <curl/curl.h>
...

size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

...

    CURL* easyhandle = curl_easy_init();
    std::string readBuffer;

    curl_easy_setopt(easyhandle, CURLOPT_URL, "https://example.com");
    curl_easy_setopt(easyhandle, CURLOPT_SSL_VERIFYPEER, false);
    curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &readBuffer);

    curl_easy_perform(easyhandle);

...
。。。
#包括
...
大小写回(char*contents、大小、大小nmemb、void*userp)
{
((std::string*)userp)->追加((char*)内容,大小*nmemb);
返回大小*nmemb;
}
...
CURL*easyhandle=CURL_easy_init();
字符串读取缓冲区;
curl\u easy\u setopt(易于处理,CURLOPT\u URL,“https://example.com");
curl\u easy\u setopt(易处理,CURLOPT\u SSL\u验证对等,false);
curl_easy_setopt(易于处理、CURLOPT_WRITEFUNCTION、WriteCallback);
curl_easy_setopt(易于处理、CURLOPT_WRITEDATA和readBuffer);
卷曲,易于操作;
...

这里您可以从curl请求(example.com)获得http响应。

libcurldll.a
将二进制文件链接到共享库(WIndows上的DLL)。如果需要静态链接,只需使用
libcurl.a
。我只是好奇,但是既然Qt提供了执行HTTP请求所需的所有类,为什么不直接使用这些类来避免麻烦呢?@JanHenke我已经从.pro文件和编译器的lib文件夹中删除了它。现在我得到了init和cleanup函数的未定义引用错误。@SirDarius,因为我已经用cUrl编写了一个相当大的应用程序,我只是想把它包装到Windows的UI中。我对卷发已经很适应了。公平地说,我也经常使用卷发。