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版本应该也是完全可以的)
在github下载后的zip包解压后得到以下目录结构,并在以下目录中创建build目录(用于后续的cmake)。

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

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

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

生成的lib与dll如下图所示

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

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

第一步 新建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中。

由于前面编译时,忘勾选了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
