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

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.xdnf.cn/news/19136.html

相关文章:

  • 32.String str=aaa与 String str=new String(aaa)一样吗?new String(“aaa”);创建了几个字符串对象
  • Linux按键驱动开发
  • 明远智睿 RK3568 核心板:以硬核性能解锁多领域应用新可能
  • 手写一个Spring框架
  • 【活动回顾】“智驱未来,智领安全” AI+汽车质量与安全论坛
  • Labview邪修01:贪吃蛇
  • 数据结构:归并排序 (Iterative Merge Sort)
  • 非支配排序遗传算法进化多目标优化算法
  • 【混合开发】Android+webview模拟crash崩溃补充说明
  • 【LeetCode每日一题】141. 环形链表 142.环形链表 II
  • Rspack
  • Kafka入门指南:从安装到集群部署
  • Mock 在 API 研发中的痛点、价值与进化及Apipost解决方案最佳实践
  • 【Docker/Redis】服务端高并发分布式结构演进之路
  • RS485、RS232、RS422协议
  • 若依微服务一键部署(RuoYi-Cloud):Nacos/Redis/MySQL + Gateway + Robot 接入(踩坑与修复全记录)
  • 云手机的安全性如何?
  • LeetCode Hot 100 第8天
  • 群组分析 (Cohort Analysis)——哪批用户最优质?
  • 【Spring底层分析】Spring AOP补充以及@Transactional注解的底层原理分析
  • 12大主流本地文档管理系统功能与价格对比分析
  • 如何设置阿里云轻量应用服务器镜像?
  • v-model与v-bind区别
  • LG P5386 [Cnoi2019] 数字游戏 Solution
  • CesiumJS 介绍以及基础使用
  • 【完整源码+数据集+部署教程】硬币分类与识别系统源码和数据集:改进yolo11-SWC
  • GoogLeNet:深度学习中的“卷积网络变形金刚“
  • 从“安全诉讼”说起:奖励模型(Reward Model)是LLM对齐的总阀门(全视角分析)
  • 如何在实际应用中选择Blaze或Apache Gluten?
  • 【拍摄学习记录】06-构图、取景