当前位置: 首页 > news >正文

C++ 编译和运行 LibCurl 动态库和静态库

简 述:

  • C++ Win11 通过源码编译 libcurl 获取其动态库和静态库
  • C++ 链接和使用 libcurl 的静态库和动态库
  • 通过 vcpkg 来编译和链接 libcurl 的库

文章目录

    • 下载 CURL 库
    • 编译动态库 & 静态库
    • C++ 项目中使用 CURL 库
      • C++ 使用 CURL 动态库
      • C++ 使用 CURL 静态库
      • C++ 通过 vcpkg 使用 CURL 库
    • 源码下载
    • 其它更多


本文初发于 “偕臧的小站”,同步转载于此。


💻 win11 24H2 📎 Qt 5.15.2 📎 Visual Studio 2022 📎 C++17


下载 CURL 库

由于 CURL 只提供源码,并不提供编译好的二进制。所以只能自行编译动态库或者静态库。 官方推荐使用静态库,而非动态库;然而负责项目都是使用的动态库,那我们就都编译一番。

在 https://curl.se/download.html 下载最新版本源码压缩包 curl-8.15.0.zip。

在这里插入图片描述

准备工作:

解压得到 D:\project\third_dll\curl-8.15.0 文件夹。

  • 右键管理员打开 "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2022\Visual Studio Tools\VC\x64 Native Tools Command Prompt for VS 2022.lnk" 终端
  • 终端打开进入到 winbuild 文件夹中 D:\project\third_dll\curl-8.15.0\winbuild

编译动态库 & 静态库

从 libcurl v8.15.0 开始,winbuild 构建系统已标记为过时,将在 2025 年 9 月正式废弃,因此必须显式添加 WINBUILD_ACKNOWLEDGE_DEPRECATED=yes 确认才能继续使用该系统编译; 若是没有则会若是遇到报错:fatal error U1050: The user must acknowledge the deprecation warning to continue.

// 编译动态库
nmake /f Makefile.vc mode=dll VC=17 MACHINE=x64 DEBUG=no WINBUILD_ACKNOWLEDGE_DEPRECATED=yes// 编译静态库
nmake /f Makefile.vc mode=static VC=17 MACHINE=x64 DEBUG=no WINBUILD_ACKNOWLEDGE_DEPRECATED=yes

执行对应命令,可以看到很顺畅的编译过程 在这里插入图片描述

看到编译后的目标产物:动态库 libcurl-vc17-x64-release-dll-ipv6-sspi-schannel 和 静态库 libcurl-vc17-x64-release-static-ipv6-sspi-schannel 这两个文件夹
在这里插入图片描述

C++ 项目中使用 CURL 库

一共有三种方法,前两者为刚才本地编译的方式库链接使用,以及直接通过 vcpkg 进行编译和使用 curl 库。

  1. libcurl-vc17-x64-release-dll-ipv6-sspi-schannel 改名为 libcurl-dll ,方便使用(名字简短好认即可);
  2. libcurl-vc17-x64-release-static-ipv6-sspi-schannel 改名为 libcurl-static;
  3. 再将这个文件夹拷贝到 D:\project\third_dll\UsedCurlDemo\tripartite 文件夹下备用(或者放在其它任意路径)
  4. 开始创建 C++ 工程来引用这两个库

C++ 使用 CURL 动态库

可以看到生成的动态库目录结构如下:在这里插入图片描述

注意:不需需要添加 CURL_STATICLIB 宏,只需要链接 libcurl.lib 之外,还需要拷贝 libcurl.dll 文件到生成文件夹中。

  • 创建一个 C++ 空的控制台项目 UsedCurlDemo

  • 引入头文件 include 路径,和链接库 lib 的路径
    在这里插入图片描述

  • main.cpp 函数中,输入如下代码

    #include <iostream>                  // 不需要使用 #define CURL_STATICLIB 宏
    #include "curl/curl.h"
    #pragma comment (lib,"libcurl.lib")using namespace std;int main(int argc, char* argv[])
    {CURL* curl;CURLcode res;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");res = curl_easy_perform(curl);curl_easy_cleanup(curl);}std::cout << "返回状态: " << res << std::endl;system("pause");return 0;
    }
    
  • libcurl.dll 拷贝进 目标产物的路径,这是运行时所需要的
    在这里插入图片描述

  • 按下按键 Ctrl + F5 在 VS2022 中进行编译和运行,看到终端收到的 baidu 服务器返回结果
    在这里插入图片描述

C++ 使用 CURL 静态库

可以看到生成的静态库目录结构如下:
在这里插入图片描述

逻辑基本同理参考动态库,只是链接的文件不同;

注意:需要添加 CURL_STATICLIB 宏,且需要链接 libcurl_a.lib 之外,还需要链接一些额外的这些库,否则无法运行。

  • 再创建一个 C++ 空的控制台项目 UsedCurlStaticDemo, 方便直接放在同一个解决方案下

  • 引入头文件 include 路径,和链接库 lib 的路径
    在这里插入图片描述

  • main.cpp 函数中,输入如下代码

    #define CURL_STATICLIB                 // 是需要表示使用静态链接的宏
    #define BUILDING_LIBCURL
    #include <iostream>
    #include "curl/curl.h"// 添加必要的库依赖,且需要链接除了 libcurl_a.lib 之外的这些库,否则无法运行
    #pragma comment (lib,"libcurl_a.lib")
    #pragma comment (lib,"wldap32.lib")
    #pragma comment (lib,"ws2_32.lib")
    #pragma comment (lib,"Crypt32.lib")
    #pragma comment(lib, "normaliz.lib")   // 添加以解决 IdnToAscii/IdnToUnicode 错误
    #pragma comment(lib, "secur32.lib")    // 添加以解决 InitSecurityInterfaceA 错误using namespace std;int main(int argc, char* argv[])
    {CURL* curl;CURLcode res;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");res = curl_easy_perform(curl);curl_easy_cleanup(curl);}std::cout << "返回状态: " << res << std::endl;system("pause");return 0;
    }
    
  • 按下按键 Ctrl + F5 在 VS2022 中进行编译和运行,看到终端收到的 baidu 服务器返回结果
    在这里插入图片描述

C++ 通过 vcpkg 使用 CURL 库

上面两种方法都需要手动配置和编译 LIBCURL 的动态库和静态库的头文件、链接库的文件夹路径;而采用 vcpkg 方法,则不需要这么麻烦,直接通过一次都本机配置好。

// 打开 cmd 终端,进入 D:\project\third_dll 路径,依次执行如下命令
git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap-vcpkg.bat
.\vcpkg\vcpkg install curlcd vcpkg
.\vcpkg integrate install   // 这样项目就能直接引用 curl 了❯ vcpkg install cpp-httplib openssl    // 还可以安装一些其它常用库
  • 创建一个空的 C++ 控制台项目 vcpkgCurl

  • 在 main.cpp 中输入

    #include <iostream>                  // 不需要使用 #define CURL_STATICLIB 宏
    #include "curl/curl.h"               // 也不需要 #pragma comment (lib,"libcurl.lib"),会自动链接
    using namespace std;int main(int argc, char* argv[])
    {CURL* curl;CURLcode res;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");res = curl_easy_perform(curl);curl_easy_cleanup(curl);}std::cout << "返回状态: " << res << std::endl;system("pause");return 0;
    }
    
  • 按下按键 Ctrl + F5 在 VS2022 中进行编译和运行,看到终端收到的 baidu 服务器返回结果
    在这里插入图片描述

源码下载

源码和编译好的二进制下载:https://github.com/XMuli/NetworkExample

其它更多

上面编译的是libcurl的 dll,使用OpenSSL Dll版本和Zlib Dll版本。如果没有,可以从www.openssl.org 或者http://www.zlib.net/ 下载。

http://www.dtcms.com/a/356441.html

相关文章:

  • SyncBack 备份同步软件: 使用 FTPS、SFTP 和 HTTPS 安全加密传输文件
  • 【2025 完美解决】Failed connect to github.com:443; Connection timed out
  • 网络编程(2)—多客户端交互
  • 跨境物流新引擎:亚马逊AGL空运服务赋能卖家全链路升级
  • Pycharm 登录 Github 失败
  • idea2023.3遇到了Lombok失效问题,注释optional和annotationProcessorPaths即可恢复正常
  • “FAQ + AI”智能助手全栈实现方案
  • 极飞科技AI智慧农业实践:3000亩棉田2人管理+产量提15%,精准灌溉与老农操作门槛引讨论
  • autojs RSA加密(使用public.pem、private.pem)
  • 【拍摄学习记录】03-曝光
  • Lora与QLora
  • 创维E910V10C_晶晨S905L2和S905L3芯片_线刷固件包
  • SpringMVC相关梳理
  • 第三方软件测试:【深度解析SQL注入攻击原理和防御原理】
  • [Mysql数据库] 知识点总结6
  • 《Linux 网络编程六:数据存储与SQLite应用指南》
  • LabVIEW转速仪校准系统
  • uniapp跨平台开发---uni.request返回int数字过长精度丢失
  • uni-app + Vue3 开发H5 页面播放海康ws(Websocket协议)的视频流
  • 学习:uniapp全栈微信小程序vue3后台(6)
  • Uniapp + UView + FastAdmin 性格测试小程序方案
  • 2025最新uni-app横屏适配方案:微信小程序全平台兼容实战
  • 项目一系列-第9章 集成AI千帆大模型
  • 实现自己的AI视频监控系统-第二章-AI分析模块5(重点)
  • js AbortController 实现中断接口请求
  • 【MFC教程】C++基础:01 小黑框跑起来
  • 【MFC应用创建后核心文件详解】项目名.cpp、项目名.h、项目名Dlg.cpp 和 项目名Dlg.h 的区别与作用
  • Java项目打包成EXE全攻略
  • Kafka 副本同步异常与 ISR 收缩故障排查实录
  • C语言————操作符详解