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#include #include #include #include #include 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 connectionn"); 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: %dn", 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



