• 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++代码

    测试代码如下所示

    1. #include <iostream>
    2. #include <string>
    3. #include <fcntl.h>
    4. #include <stdio.h>
    5. #include <sys/stat.h>
    6. #include <curl/curl.h>
    7. using namespace std;
    8. bool read_file(const char* path, const char* local_file)
    9. {
    10. cout << "download " << path << " to local: " << local_file << endl;
    11. string url = path;
    12. CURL* conn = curl_easy_init();
    13. if (conn == NULL) {
    14. fprintf(stderr, "Failed to create CURL connection\n");
    15. return false;
    16. }
    17. std::cout << "down file from:" << url << std::endl;
    18. curl_easy_setopt(conn, CURLOPT_URL, url.c_str());
    19. //设置不验证https的ssl证书
    20. curl_easy_setopt(conn, CURLOPT_SSL_VERIFYPEER, 0);
    21. curl_easy_setopt(conn, CURLOPT_SSL_VERIFYHOST, 0)
    22. ;
    23. curl_easy_setopt(conn, CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
    24. curl_easy_setopt(conn, CURLOPT_USERNAME, "");
    25. curl_easy_setopt(conn, CURLOPT_PASSWORD, "");
    26. curl_easy_setopt(conn, CURLOPT_COOKIE, "cookiejar.txt");//设置cookie 【发生到服务器】
    27. curl_easy_setopt(conn, CURLOPT_COOKIEFILE, "cookiejar.txt");//设置cookie 【服务器操作cookie后保存】
    28. //curl_easy_setopt(conn, CURLOPT_NOPROGRESS, 1L);
    29. //curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, write_data);
    30. FILE* target = fopen(local_file, "wb");
    31. if (target == NULL) {
    32. fprintf(stderr, "Failed to open [%s], errno: %d\n", local_file, errno);
    33. return false;
    34. }
    35. curl_easy_setopt(conn, CURLOPT_WRITEDATA, target);
    36. CURLcode code = curl_easy_perform(conn);
    37. if (code != CURLE_OK) {
    38. fprintf(stderr, "Failed to get file [%s]\n", curl_easy_strerror(code));
    39. return false;
    40. }
    41. fclose(target);
    42. curl_easy_cleanup(conn);
    43. return true;
    44. }
    45. int main() {
    46. read_file("https://codeload.github.com/curl/curl/zip/refs/heads/master","curl.zip");
    47. return 0;
    48. }

    代码执行结果如下图所示,需要注意的是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

  • 相关阅读:
    单页面使用 iview
    内网可达网段探测netspy- Mac环境
    【毕业设计】基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码)——村镇旅游网站
    【数据结构】循环队列的实现
    进程与线程
    尚硅谷springboot笔记
    电脑盘符错乱,C盘变成D盘怎么办?
    十、Ajax&Axios
    【Linux】进程等待
    javaScript 使用indexOf 撸一下模糊查询
  • 原文地址:https://blog.csdn.net/a486259/article/details/125504176