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

c++开发之编译curl(windows版本)

在 Windows 上编译支持 OpenSSL 的 cURL 库并不简单,因为涉及到多个库的依赖关系以及工具链的配置。以下是编译支持 OpenSSL 的 cURL 库的详尽步骤:

环境要求

  1. 编译工具链

    • MinGW 或 Visual Studio
    • CMake
    • Perl (用于编译 OpenSSL)
    • NASM (用于编译 OpenSSL)
    • OpenSSL
    • cURL

步骤概览

  1. 安装编译工具链
  2. 编译 OpenSSL
  3. 编译 cURL 并链接 OpenSSL
  4. 测试

详细步骤

1. 安装编译工具链

如果你使用 MinGW,请安装 MinGW-w64,并确保路径中包含 gccg++ld 等工具。

如果你使用 Visual Studio,安装 Visual Studio 并确保安装了 C++ 开发工具包(MSVC 编译器)。

安装 CMake 以帮助生成适合不同编译器的构建文件。

# 确认 cmake 和编译器可以正常运行
cmake --version
gcc --version (或 cl --version)
2. 编译 OpenSSL
  1. 下载 OpenSSL 源代码: 从 OpenSSL 官方 下载 OpenSSL 源代码。

  2. 解压并进入 OpenSSL 源代码目录: 打开命令提示符,进入下载并解压后的目录。

    tar -xvf openssl-1.1.1x.tar.gz
    cd openssl-1.1.1x
    

  3. 配置 OpenSSL

    • MinGW: 使用 MinGW 编译时,配置 OpenSSL:

      perl Configure mingw64 --prefix=C:/path/to/install/openssl

    • Visual Studio: 如果使用 MSVC,配置 OpenSSL:

      perl Configure VC-WIN64A --prefix=C:/path/to/install/openssl

  4. 编译并安装: 使用 nmake 或 make 进行编译:

    • MinGW

      mingw32-make mingw32-make install

    • Visual Studio

      nmake nmake install

    编译完成后,OpenSSL 的二进制文件会安装在你指定的 --prefix 路径中。

3. 编译 cURL 并链接 OpenSSL
  1. 下载 cURL 源代码: 从 cURL 官方 下载最新的 cURL 源代码,并解压。

    tar -xvf curl-7.xx.x.tar.gz cd curl-7.xx.x

  2. 配置 cURL

    使用 CMake 配置 cURL 项目,并指定 OpenSSL 的路径。

    • MinGW: 如果使用 MinGW,运行以下命令:

      cmake -G "MinGW Makefiles" -DCMAKE_USE_OPENSSL=ON -DOPENSSL_ROOT_DIR=C:/path/to/install/openssl -DOPENSSL_INCLUDE_DIR=C:/path/to/install/openssl/include -DCMAKE_INSTALL_PREFIX=C:/path/to/install/curl

    • Visual Studio: 如果使用 Visual Studio,运行以下命令:

      cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_USE_OPENSSL=ON -DOPENSSL_ROOT_DIR=C:/path/to/install/openssl -DOPENSSL_INCLUDE_DIR=C:/path/to/install/openssl/include -DCMAKE_INSTALL_PREFIX=C:/path/to/install/curl

    CMake 参数说明

    • -DCMAKE_USE_OPENSSL=ON:启用 OpenSSL 支持。
    • -DOPENSSL_ROOT_DIR:指定 OpenSSL 的安装路径。
    • -DOPENSSL_INCLUDE_DIR:指定 OpenSSL 的头文件路径。
    • -DCMAKE_INSTALL_PREFIX:指定 cURL 的安装路径。
  3. 编译并安装 cURL

    • MinGW

      mingw32-make mingw32-make install

    • Visual Studio: 打开 Visual Studio 的开发者命令提示符并运行:

      nmake nmake install

    安装完成后,cURL 可执行文件和库会被安装在你指定的路径中。

4. 测试
  1. 检查是否成功编译: 进入安装路径,运行 curl 查看是否能正常运行。

    curl --version

    应该输出包含 OpenSSL 支持的信息:

    curl 7.xx.x (x86_64-pc-win32) libcurl/7.xx.x OpenSSL/1.1.1x

  2. 测试 HTTPS 请求: 运行一个 HTTPS 请求来验证 OpenSSL 支持。

    curl https://www.example.com

额外注意事项

  • 依赖的库:在 Windows 上,确保所有依赖库都已正确安装并可以被链接。
  • 路径问题:确保所有依赖库的路径(如 OpenSSL)被正确设置在系统环境变量中。
  • OpenSSL 版本:确保 OpenSSL 版本与 cURL 兼容,推荐使用最新稳定版本。

这样就完成了在 Windows 上使用 OpenSSL 编译 cURL 的过程。

附使用案例:

在 Visual Studio 2010 中添加和使用 cURL 库的步骤如下,详细说明如何下载、配置和在项目中使用 cURL 库。

1. 下载所需的文件(也可以使用自己编译的版本)

  • cURL 库:从 cURL 官网 下载预编译的 Windows 版本。选择合适的版本(如带有 SSL 支持的版本)。
  • OpenSSL 库:如果需要 HTTPS 支持,下载与 cURL 兼容的 OpenSSL 库。
  • zlib 库(可选):如果需要支持压缩或解压缩功能,可下载 zlib 库。

2. 配置 cURL 库

  1. 解压库文件: 将下载的 cURL 和 OpenSSL(如果需要)解压到你选择的路径,如:

    C:\libs\curl C:\libs\openssl

  2. 包含头文件和库文件: 在解压后的文件夹中找到以下内容:

    • 头文件include 文件夹中的 .h 文件)
    • 库文件lib 文件夹中的 .lib 文件,可能还有 .dll 文件)

3. 在 Visual Studio 2010 项目中添加 cURL 库

  1. 创建新项目: 打开 Visual Studio 2010,创建一个新的 C++ 控制台项目,或在现有项目中使用。

  2. 配置项目属性

    • 右键点击项目 -> Properties (属性)。
    • 在属性页中,找到 Configuration Properties -> C/C++ -> General
      • 在 Additional Include Directories 中添加 cURL 和 OpenSSL 的头文件路径:

        C:\libs\curl\include C:\libs\openssl\include

  3. 配置链接库

    • 继续在 Configuration Properties 中,找到 Linker -> General
      • 在 Additional Library Directories 中添加 cURL 和 OpenSSL 的库文件路径:

        C:\libs\curl\lib C:\libs\openssl\lib

  4. 添加库文件

    • 在 Linker -> Input 下,找到 Additional Dependencies,并添加以下库:
      • 对于 cURL:

        libcurl.lib

      • 对于 OpenSSL(如果使用 HTTPS):

        libssl.lib libcrypto.lib

4. 项目中使用 cURL 库

在项目的源代码文件中包含 cURL 的头文件,并编写示例代码。例如,在 main.cpp 中添加以下代码:

#include <iostream>
#include <curl/curl.h>// 写入数据的回调函数,用于处理 cURL 请求的响应数据
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp)
{((std::string*)userp)->append((char*)contents, size * nmemb);return size * nmemb;
}int main()
{CURL* curl;CURLcode res;// 初始化 cURLcurl = curl_easy_init();if(curl) {std::string readBuffer;// 设置请求的 URLcurl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");// 设置回调函数来处理服务器响应数据curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);// 执行请求res = curl_easy_perform(curl);// 检查是否有错误if(res != CURLE_OK)fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));elsestd::cout << "Response Data: " << readBuffer << std::endl;// 清理 cURLcurl_easy_cleanup(curl);}return 0;
}

5. 配置依赖的动态库(.dll)

如果使用了 .dll 库(特别是 OpenSSL),确保将 .dll 文件复制到项目的可执行文件路径,或者将其路径添加到系统环境变量 PATH 中。常见的 .dll 包括:

  • libcurl.dll
  • libssl.dll
  • libcrypto.dll

这些文件可以从 OpenSSL 和 cURL 解压文件夹中的 bin 目录找到。

6. 生成并运行项目

在项目属性中选择 Debug 或 Release 版本,确保所有库的路径和文件正确配置。点击 Build -> Build Solution来编译项目。

如果一切配置正确,你将会看到来自 https://www.example.com 的响应数据输出到控制台。

7. 常见问题和解决方案

  1. 找不到库文件:确保库文件路径正确配置,并且 .lib 文件存在于指定的路径中。
  2. DLL 找不到错误:运行时确保将相应的 .dll 文件放置在可执行文件所在目录,或者将其路径添加到系统环境变量 PATH 中。
  3. SSL 错误:如果需要支持 HTTPS,请确保 OpenSSL 的库文件被正确配置,并且 .dll 文件位于系统路径中。

相关文章:

c++开发之编译curl(windows版本)

在 Windows 上编译支持 OpenSSL 的 cURL 库并不简单&#xff0c;因为涉及到多个库的依赖关系以及工具链的配置。以下是编译支持 OpenSSL 的 cURL 库的详尽步骤&#xff1a; 环境要求 编译工具链&#xff1a; MinGW 或 Visual StudioCMakePerl (用于编译 OpenSSL)NASM (用于编译…...

IT运维挑战与对策:构建高效一体化运维管理体系

在当今数字化时代&#xff0c;IT运维作为企业运营的核心支撑&#xff0c;其重要性不言而喻。然而&#xff0c;随着业务规模的扩大和技术的不断革新&#xff0c;IT运维团队面临着前所未有的挑战。本文旨在深度剖析当前IT运维中存在的主要问题&#xff0c;并探索一体化解决方案&a…...

前海石公园的停车点探寻

前海石公园是真的很美&#xff0c;很多看海人&#xff0c;很多钓鱼佬&#xff0c;很多抓螃蟹的人&#xff0c;很多挖沙子的人&#xff0c;很多拍照的人&#xff0c;尤其是没有大太阳的时间段或每天傍晚或每个放假的时候人气超高&#xff0c;故前海石公园停车真的很紧张。由于前…...

嵌入式学习--线性表Day01

嵌入式学习--线性表Day01 顺序表 1.1数组的插入、删除操作 1.2修改为last版本 1.3顺序表相关操作 顺序表、单向链表、单向循环链表、双向链表、双向循环链表、顺序栈、链式栈、循环队列&#xff08;顺序队列&#xff09;、链式队列 1&#xff09;逻辑结构&#xff1a;线性结构 …...

Rust 全局变量的最佳实践 lazy_static/OnceLock/Mutex/RwLock

在实际项目开发中&#xff0c;难免需要用到全局变量&#xff0c;比如全局配置信息&#xff0c;全局内存池等&#xff0c;此类数据结构可能在多处需要被使用&#xff0c;保存为全局变量可以很方便的进行修改与读取。 在Rust中&#xff0c;如果只是读取静态变量是比较简单的&…...

【L波段差分干涉SAR卫星(陆地探测一号01组)】

L波段差分干涉SAR卫星&#xff08;陆地探测一号01组&#xff09; L波段差分干涉SAR卫星&#xff08;陆地探测一号01组&#xff09;是我国自主研发的重要卫星系统&#xff0c;以下是对该卫星的详细介绍&#xff1a; 一、基本信息 卫星组成&#xff1a;陆地探测一号01组由A星…...

第五部分:6---信号的递达

目录 信号的递达流程&#xff1a; 信号在什么时候递达&#xff1f; 用户态和内核态&#xff1a; 内核态、用户态在页表的映射关系&#xff1a; 操作系统如何得知当前执行状态是用户态还是内核态&#xff1f; 操作系统如何处理被捕捉的信号&#xff1f; 信号的递达流程&am…...

深入解析 ARM64 SOC RK3568的 /proc/interrupts 输出

在 Linux 系统中&#xff0c;/proc/interrupts 文件提供了系统中断的详细信息&#xff0c;是性能分析和故障排除的重要工具。本文将重点解析 RK3568环境下该文件的输出格式及其背后的结构。 什么是 /proc/interrupts&#xff1f; /proc/interrupts 文件记录了所有中断的信息&…...

Android常用C++特性之std::unique

声明&#xff1a;本文内容生成自ChatGPT&#xff0c;目的是为方便大家了解学习作为引用到作者的其他文章中。 std::unique 是 C 标准库中的一个算法函数&#xff0c;用于移除相邻的重复元素&#xff0c;使每个相邻的元素在容器中保持唯一。它不会真正移除元素&#xff0c;而是通…...

Redis篇(Java操作Redis)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;Jedis Github 一、创建项目、 二、添加依赖 三、配置文件 四、Java连接Redis 五、通过Redis连接池获取连接对象并操作服务器 六、封装JedisUtil对外提供连接对象获取方法 七、Java操作Redis五种数据类型 1. 连接与释放…...

Cypress自动化Github workflow

目录 Workflow .github/workflows/build.yaml jobs build-deploy: .github/wrokflows/execute-tests.yaml 输入参数 jobs restart_failed_dp: seed_data: execute-tests: Docker File docker/Dockerfile.base docker/service-dockerfile.base Deploy deploy/tes…...

Hbase高阶知识:HBase的协处理器(Coprocessor)原理、使用实例、高级技巧和案例分析

目录 第一章 Hbase概述与基础知识 1.1 HBase的架构与数据模型 1.2 什么是协处理器 1.3 协处理器的优势 第二章 协处理器的工作原理 2.1 协处理器的运行机制 2.2 协处理器的注册与监听 2.3 协处理器与RegionServer的交互 第三章 协处理器的类型 3.1 端点协处理器 3.2…...

海尔嵌入式硬件校招面试题及参考答案

使用 QT 的经验及对控件和信号与槽机制的了解 我使用 QT 有一段时间了,在项目开发中积累了较为丰富的经验。 QT 中的控件丰富多样,涵盖了各种常见的界面元素需求。例如按钮、文本框、列表框、进度条等。这些控件具有良好的可定制性,可以通过属性设置、样式表等方式来调整外观…...

Leetcode基础算法篇|202409(4)贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff1a;一种在每次决策时&#xff0c;总是采取在当前状态下的最好选择&#xff0c;从而希望导致结果是最好或最优的算法。 学习链接&#xff1a;leetcode-notes/docs/ch04/04.04/04.04.02-Exercises.md at main datawha…...

echarts 导出pdf空白原因

问题阐述 页面样式&#xff1a; 导出pdf: 导出pdf&#xff0c;统计图部分为空白。 问题原因 由于代码中进行了dom字符串的复制&#xff0c;而echarts用canvas绘制&#xff0c;canvas内部内容不会进行复制&#xff0c;只会复制canvas节点&#xff0c;因此导出pdf空白。 解决…...

数据结构及基本算法

目录 第一章 概论 第一节 引言 第二节 基本概念和常用术语 第三节 算法的描述与分析 第二章 线性表 第一节 线性表定义和基本运算个 一、线性表的逻辑定义 二、线性表的基本运算 第二节 线性表的顺序存储和基本运算的实现 一、线性表的顺序存储 二、顺序表上基本运算…...

vue3学习记录-computed

vue3学习记录-computed 1.为什么要用computed2.使用方法2.1 基本实例2.2 可写计算属性 1.为什么要用computed 写个购物车的案例 <script setup> import { ref, reactive,computed } from "vue" const tableData reactive([{ name: 商品1, price: 10, num: 1…...

SQLite3模块使用详解

目录 一、引言 1.1 SQLite3 简介 1.2 Python sqlite3 模块 二、连接数据库 2.1 导入 sqlite3 模块 2.2 连接数据库 2.3 创建游标对象 三、执行 SQL 语句 3.1 创建表 3.2 插入数据 3.3 查询数据 3.4 更新数据 3.5 删除数据 四、处理查询结果 4.1 fetchall() 4.2…...

防火墙详解(三)华为防火墙基础安全策略配置(命令行配置)

实验要求 根据实验要求配置防火墙&#xff1a; 合理部署防火墙安全策略以及安全区域实现内网用户可以访问外网用户&#xff0c;反之不能访问内网用户和外网用户均可以访问公司服务器 实验配置 步骤一&#xff1a;配置各个终端、防火墙端口IP地址 终端以服务器为例&#xff…...

假期学习--iOS中的static关键字

iOS中的static关键字 OC的static关键字 OC也提供了Static关键字&#xff0c;但是这个static关键字不能用于修饰成员变量&#xff0c;也就是说Static是不被允许修饰实例变量&#xff0c;同时Static关键字也不被允许修饰方法。Static关键字可以修饰全局变量&#xff0c;局部变量…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...