win10用cmake3.22与vs2019编译curl库源码并调用

curl是一个利用URL语法在命令行下工作的文件传输工具,支持很多种http请求操作,详情可以参考Linux curl命令最全详解_Angel_CG的博客-CSDN博客_curl命令。curl现在在linux与win10都是有内置的,在命令行中可以直接使用curl指令。博主一开始找了很久,都没有看到适用于vs的curl win10库,因此自己找到了curl库的源码进行了编译,并通过了命令行调用与c++调用。

curl库的源码下载地址:https://github.com/curl/curl

博主编译环境:vs2019,cmake3.22 (编译过程中没有任何特殊设置,因此博主认为其他vs、cnake版本应该也是完全可以的)

1、下载并解压源码

在github下载后的zip包解压后得到以下目录结构,并在以下目录中创建build目录(用于后续的cmake)。

 2、cmake生成vs项目

打开cmake,将源代码路径与build路径填入到下图相应的位置。然后依次点击Configure(该过程会弹出vs选项,选默认值即可)、Generate、Open Project。点击Open Project后将会在vs中打开项目。

3、vs生成库文件

此时VS的界面如下图所示,先安装自己的需求选择Release/Debug ,x64/32等版本。然后,点击选择ALL_BUILD项目,并单击右键在弹出界面中点击生成。最后,项目生成成功。输出结果可见下图最底部的红框。

进入build目录,此时生成的文件目录如下所示 。

 生成的lib与dll如下图所示

 生成的curl.exe如下图所示,其中红框部分是博主从lib/Release拷贝来的。因为执行curl.exe需要调用libcurl.dll。

4、curl.exe测试

与系统自带的curl相比,博主编译的curl.exe很明显不支持https,ftps等带安全认证的协议,相比是博主在编译时没有配置openssl所导致的。

5、libcurl测试

第一步  新建vs c++空项目

第二步  配置vs项目

在相应的位置配置include、lib的路径。并在链接器-》输入-》附加依赖项中配置libcurl_imp.lib;

第三步编写C++代码

测试代码如下所示

#include <iostream>
#include <string>

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>

#include <curl/curl.h>

using namespace std;

bool read_file(const char* path, const char* local_file)
{
    cout << "download " << path << " to local: " << local_file << endl;

    string url = path;

    CURL* conn = curl_easy_init();
    if (conn == NULL) {
        fprintf(stderr, "Failed to create CURL connection\n");
        return false;
    }

    std::cout << "down file from:" << url << std::endl;
    curl_easy_setopt(conn, CURLOPT_URL, url.c_str());
    //设置不验证https的ssl证书
    curl_easy_setopt(conn, CURLOPT_SSL_VERIFYPEER, 0);
    curl_easy_setopt(conn, CURLOPT_SSL_VERIFYHOST, 0)
        ;
    curl_easy_setopt(conn, CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
    curl_easy_setopt(conn, CURLOPT_USERNAME, "");
    curl_easy_setopt(conn, CURLOPT_PASSWORD, "");
    curl_easy_setopt(conn, CURLOPT_COOKIE, "cookiejar.txt");//设置cookie 【发生到服务器】
    curl_easy_setopt(conn, CURLOPT_COOKIEFILE, "cookiejar.txt");//设置cookie 【服务器操作cookie后保存】
    //curl_easy_setopt(conn, CURLOPT_NOPROGRESS, 1L);
    //curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, write_data);

    FILE* target = fopen(local_file, "wb");
    if (target == NULL) {
        fprintf(stderr, "Failed to open [%s], errno: %d\n", local_file, errno);
        return false;
    }
    curl_easy_setopt(conn, CURLOPT_WRITEDATA, target);
    CURLcode code = curl_easy_perform(conn);
    if (code != CURLE_OK) {
        fprintf(stderr, "Failed to get file [%s]\n", curl_easy_strerror(code));
        return false;
    }

    fclose(target);
    curl_easy_cleanup(conn);
    return true;
}
int main() {
    read_file("https://codeload.github.com/curl/curl/zip/refs/heads/master","curl.zip");
    return 0;
}

代码执行结果如下图所示,需要注意的是dll文件要与exe在同一个路径下,或者将dll文件的路径添加到系统环境变量path中。 

6、curl带SSL编译

由于前面编译时,忘勾选了CURL_USE_OPENSLL导致curl.exe不支持https,因此重新编译。

cmake的选项    通过Search SLL,找到 CURL_USE_OPENSLL 并勾选。然后按照前面的步骤生成项目,在vs里面打开,在ALL_BUILD项目中单击右键点击重新生成。然后生成的curl.exe就支持https啦。

详情下图,当时博主测试的命令为  curl.exe -L https://codeload.github.com/curl/curl/zip/refs/heads/master -o curl.zip

猜你喜欢

转载自blog.csdn.net/a486259/article/details/125504176