【问题标题】:How to statically link to libcUrl in Qt on Windows?如何在 Windows 上的 Qt 中静态链接到 libcUrl?
【发布时间】:2016-01-28 10:15:59
【问题描述】:

我已经尝试按照我可以在网上找到的所有指南进行操作,我非常接近但卡住了。项目构建并运行。但是它立即崩溃。 我使用Qt Creator 3.5.1 和Qt 5.5.1,编译器是MinGW 4.9.2 32 bit。

我从 http://curl.haxx.se/download.html 下载的 cUrl 库是 Win32 Generic Win32 7zip 7.45.0 binary SSL SSH Viktor Szakáts

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

我也右击项目,点击“添加库”,选择“系统库”,只选择Windows并设置为静态链接,并添加libcurl.a和libcurldll.a,放在编译器C:\Qt\Tools\mingw492_32\lib的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;
}

崩溃的原因是什么?

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

【问题讨论】:

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

标签: c++ windows qt curl


【解决方案1】:

下载适用于 Windows(64 位)的 curl:

https://curl.haxx.se/windows/dl-7.72.0_5/curl-7.72.0_5-win64-mingw.zip

或者这个对于 32 位:

https://curl.haxx.se/windows/dl-7.72.0_5/curl-7.72.0_5-win32-mingw.zip

首先你必须将 curl 中的文件夹放入 qt 中的文件夹中。

这些是:

"包括", “解放”, “垃圾箱”

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

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

注意 - 你必须把你的路径带到你的 lib - 你的 QT 安装目录。

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

...
#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);

...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多