下载 libcurl 库

https://curl.se/download.html 这个地址下载 win64 的 mingw 版本的 libcurl 二进制文件。然后解压,发现 lib 文件夹下面有两个库文件,libcurl.alibcurl.dll.a.

两个库的区别

在网上搜索了一圈,都没有找到相关的解释,最后还是在解压出来的文件里面找到了说明。curl-7.77.0-win64-mingw\docs\FAQ.txt 这个里面说的很清楚。

  5.7 Link errors when building libcurl on Windows!

  You need to make sure that your project, and all the libraries (both static
  and dynamic) that it links against, are compiled/linked against the same run
  time library.

  This is determined by the /MD, /ML, /MT (and their corresponding /M?d)
  options to the command line compiler. /MD (linking against MSVCRT dll) seems
  to be the most commonly used option.

  When building an application that uses the static libcurl library, you must
  add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
  dynamic import symbols. If you're using Visual Studio, you need to instead
  add CURL_STATICLIB in the "Preprocessor Definitions" section.

  If you get linker error like "unknown symbol __imp__curl_easy_init ..." you
  have linked against the wrong (static) library.  If you want to use the
  libcurl.dll and import lib, you don't need any extra CFLAGS, but use one of
  the import libraries below. These are the libraries produced by the various
  lib/Makefile.* files:

       Target:          static lib.   import lib for libcurl*.dll.
       -----------------------------------------------------------
       MingW:           libcurl.a     libcurldll.a
       MSVC (release):  libcurl.lib   libcurl_imp.lib
       MSVC (debug):    libcurld.lib  libcurld_imp.lib
       Borland:         libcurl.lib   libcurl_imp.lib

所以如果想要使用静态库,那就用 libcurl.a, 如果想用动态,就用 libcurldll.a。 但是注意:如果选择动态库,那么必须把 bin 文件夹下面的 libcurl-x64.dll 复制到 debug 或者 release 文件夹下面,dll 文件加上 dll.a 这两个文件组合起来才是完整的动态库。如果没有复制 dll 文件,程序运行不起来,会提示 异常退出。

参考: https://blog.csdn.net/qq_39989653/article/details/78947324
https://blog.csdn.net/trustguan/article/details/13607531
https://www.cnblogs.com/jiuzheer/p/9250704.html

添加库

在项目文件上右键,添加库 -> 外部库 -> 选择你想要的库。 注意,不要勾选 为 debug 版本添加 d 后缀。 qt 自动添加了三条语句。

unix|win32: LIBS += -L$$PWD/../../../../3rd-party/curl-7.77.0-win64-mingw/lib/ -llibcurl.dll

INCLUDEPATH += $$PWD/../../../../3rd-party/curl-7.77.0-win64-mingw/include
DEPENDPATH += $$PWD/../../../../3rd-party/curl-7.77.0-win64-mingw/include

参考: https://www.jianshu.com/p/2350034fe380

DEPENDPATH 作用

DEPENDPATH 里面添加的会作为 make 中目标的依赖,一旦这个里面的内容改变了,相应的目标也会被重新编译。

增加DEPENDPATH设置
debug/main.o: ../../TestBoost/main.cpp def.h
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\main.o ..\..\TestBoost\main.cpp

类似于上面的 main.cpp 和 def.h 如果改变了,都会导致 main.o 的重新编译。有些时候,修改了某些内容,结果没有重新编译,可能就是没有添加到依赖里面。

参考: https://blog.csdn.net/My__God/article/details/111517166

额外库下载

https://curl.se/windows/dl-7.73.0/
https://curl.se/windows/
参考: https://github.com/curl/curl-for-win

测试

上面准备做好了之后,可以进行简单的测试,直接在 mainwindow.cpp 中添加一个测试函数,然后在 MainWindow 的构造函数中调用即可。

void CurlTest()
{
    CURL *curl = nullptr;
    CURLcode res;
    curl = curl_easy_init();
    if (curl != nullptr) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");
        /* example.com is redirected, so we tell libcurl to follow redirection */
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        /* Perform the request, res will get the return code */
        res = curl_easy_perform(curl);
        /* Check for errors */
        if (res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        }
        /* always cleanup */
        curl_easy_cleanup(curl);
    }
}

参考: https://www.jianshu.com/p/6dc3ecec0245

下载 libcrypto

在 libcurl 的下载页面靠下的位置有 OpenSSL 下载链接,下载解压就可以了。

添加编译选项

在 pro 文件中增加:

unix|win32: LIBS += -L$$PWD/../../../../3rd-party/openssl-1.1.1k-win64-mingw/lib/ -llibcrypto.dll

INCLUDEPATH += $$PWD/../../../../3rd-party/openssl-1.1.1k-win64-mingw/include
DEPENDPATH += $$PWD/../../../../3rd-party/openssl-1.1.1k-win64-mingw/include

复制 dll 文件

把解压文件夹下面的 libcrypto-1_1-x64.dll 复制到 debug 文件夹下面即可。否则会出现 crash 的问题。

参考:

https://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html
https://www.qtcentre.org/printthread.php?t=633&pp=20&page=1

标签: C++

添加新评论