libcurl交叉编译支持https

2023-11-19

简介

libcurl是一个跨平台的网络协议库,支持dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp等协议。这是一个优秀稳定的网络库,是c++进行http开发的首选。

下载源码

curl官网地址:https://curl.haxx.se/libcurl/
openssl官网地址:https://www.openssl.org

移植

如果只需要http接口访问,我们只需要移植curl即可,但实际上现在很多网页都是https方式,因此我们需要libcurl支持https协议。特别需要注意的一点是如果不打开ssl支持,去访问https接口将会访问失败,返回错误:CURLE_UNSUPPORTED_PROTOCOL, 1: unsupported protocol
移植的时候需要打开–with-ssl,下载libcurl解压源码,进入源码目录查看帮助:./configure -h
在这里插入图片描述
这里我们可以看到–with-ssl=PATH后面是openssl的路径。
好了,接下来我们开始移植工作。

1.移植openssl

移植这个库之前需要注意需要特别注意的一个坑,如果目标平台是32位系统需要指定平台,64位则略过。32位系统如果不指定,curl在使用过程很可能会出现ssl握手失败的可能:
curl: (35) error:1007C06B:elliptic curve routines:EC_POINT_set_affine_coordinates_GFp:point is not on curve

最终我使用的配置如下:

setarch linux32 ./config no-asm shared --prefix=/home/xxx/work/Hi3516/bulid_libs/openssl --cross-compile-prefix=arm-himix200-linux-
或者
setarch i386 ./config no-asm shared --prefix=/home/xxx/work/Hi3516/bulid_libs/openssl --cross-compile-prefix=arm-himix200-linux-

setarch i386:声明生成的是32位CPU,如果是64位CPU则去除该部分。
no-asm: 是在交叉编译过程中不使用汇编代码代码加速编译过程,原因是它的汇编代码是对arm格式不支持的。
shared :生成动态连接库。
–prefix :指定make install后生成目录的路径。

2.移植libcurl

./configure --with-ssl=/home/xxx/work/Hi3516/mklibs/bulid_libs/openssl --prefix=/home/xxx/work/Hi3516/bulid_libs/curl --host=arm-himix200-linux CC=arm-himix200-linux-gcc CXX=arm-himix200-linux-g++

配置过程情理之中意料之外的出现了错误:
checking for HMAC_Update in -lcrypto… no
checking for HMAC_Init_ex in -lcrypto… no
checking for ssl_version in -laxtls… no
configure: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.

这个错误很奇怪,应该是找不到ssl目录下libcrypto库,当然前提是要于存在ssl和crypto库,但是在我指定的ssl库明显是有这个库的,经过查找答案,在配置前面加路径声明:
LDFLAGS=-L/home/xxx/work/Hi3516/mklibs/bulid_libs/openssl/lib
但是让人抓狂的是上个错误没了,却出现另外一个问题:
configure: error: OpenSSL libs and/or directories were not found where specified!
说到底还是没找到库文件,百思不得其解。困顿良久,通过仔细分析发现原因所在,因为我编译完openssl后把目录移动了,而curl编译的时候查找依赖是通过pkg-config下的.pc文件进行查找的,我移动了目录,但是pc文件却还指向我原来的目录,ok,把openssl整个目录搬回原来路劲,在进行配置,完美通过~!
可以看到支持配置打印:
SSL support: enabled (OpenSSL)

接下来就是make & make install
到此支持ssl的curl编译完成。把bin、lib拷贝到开发板进行测试。

测试使用

curl -v https://www.baidu.com

很不幸的再次翻车:
在这里插入图片描述
很明显这是由于没有设置本地证书导致https访问失败,这里有2个办法,下载证书放到本地路径:https://curl.haxx.se/docs/sslcerts.html
或者跳过证书验证:

curl -v -k https://www.baidu.com

访问成功:
在这里插入图片描述
到此支持https的libcurl移植完成。下面我们进行简单的代码访问测试,
实现http/get接口

int Http::http_get_api(const string &url, string &response, const char *ca_path)
{
    CURLcode res;
    CURL* curl = curl_easy_init();
    if (NULL == curl)
    {
        return CURLE_FAILED_INIT;
    }
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
    if (NULL == ca_path)
    {
        //设定为不验证证书和HOST
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    else
    {
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_easy_setopt(curl, CURLOPT_CAINFO, ca_path);
    }
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 4);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 4);//超时设置
    
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    
    if(res)
    {
     	printf("http get response failed!");
    }
    return res;
}

简单的介绍下:
(1)调用curl_easy_init()函数得到 easy interface型指针
(2)调用curl_easy_setopt()设置传输参数
(4)调用curl_easy_perform()函数完成传输任务
(5)调用curl_easy_cleanup()释放内存

作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libcurl交叉编译支持https 的相关文章

随机推荐

  • 打开mysql的步骤。

    安装mysql软件之后 打开mysql 显示error Can t connect to MySQL server on localhost 10061 原因是服务器没开 这个时候workbench连接不上 然后client登录不上 总结m
  • 2023华为OD机试真题【星际篮球争霸赛/动态规划】

    题目描述 在星球争霸篮球赛对抗赛中 最大的宇宙战队希望每个人都能拿到MVP MVP的条件是单场最高分得分获得者 可以并列所以宇宙战队决定在比赛中尽可能让更多队员上场 并且让所有得分的选手得分都相同 然而比赛过程中的每1分钟的得分都只能由某一
  • Radxa Rock 3a NPU调用指南

    0x0 Radxa Rock 3a开发板介绍 Radxa Rock 3a开发板是基于瑞芯微RK3568芯片设计的 ARM CPU采用4核Cortex A55 Cortex A53的继任者 主频最高可达2 0Ghz CPU性能相当于中高端手机
  • paramiko sftp 问题记录

    paramiko 是一款非常优秀得远程ssh库 能够ssh远程到主机 并执行命令 而且还能通过sftp连接主机 笔者得测试环境 因为安全关系 ssh默认端口修改成其他端口 再往上查阅资料 连接sftp 代码 t paramiko Trans
  • 坐标移动c语言,C语言 坐标移动详解及实例代码

    搜索热词 题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或者D或者W或者S 数字
  • 【狂神说】Mybatis学习笔记(全)

    文章目录 前言 1 简介 1 1 什么是MyBatis 1 2 如何获得Mybatis 1 3 持久化 1 3 1 数据持久化 1 3 2 为什么需要持久化 1 4 持久层 1 5 为什么需要MyBatis 2 第一个Mybatis程序 2
  • 《IT项目管理》-大题&计算题保分秘籍

    经过今天的努力 已经把大部分大题和计算题全部总结完了 希望对你们有用 查看链接自取 百度网盘 APP即可获取 链接 https pan baidu com s 1U0EFY23KgTtM8lKlYnjrug pwd tehx 提取码 teh
  • 软考-嵌入式系统设计师-笔记:历年专业英语题

    文章目录 2020年 2019年 2018年 2017年 2016年 2015年 2014年 2013年 2020年 题目 加粗的为各题答案 Fog computing is a mid layer between cloud data c
  • deepIn 、 DDE 系统桌面黑屏解决方案

    桌面黑屏有两种情况 1 桌面除了底部菜单栏 其它全是黑的 解决方案 Deepin sudo apt install reinstall dde DDE sudo apt fix broken install sudo apt install
  • 基于SpringBoot和vue的若依后台管理系统 部署

    RuoYi Vue是一款前后端分离的极速后台开发框架 基于SpringBoot和Vue 目录 一 准备 二 启动前端项目 解决报错 digital envelope routines unsupported 测试 三 启动后端项目 四 运行
  • 8个适合新手的Python小项目

    这是我挑出来的8个适合新手的小项目 涉及了爬虫 多线程 selenium PhantomJs itchat 邮件发送 crontab 命令行颜色显示 excel操作 PIL 识别验证码 首先说明 天下没有免费的午餐 每个项目平均下来2元多一
  • 根据子网掩码算出 IP 地址 的网络号和主机号

    我们如何根据子网掩码算出 IP 地址 的网络号和主机号呢 举个例子 比如 10 100 122 0 24 后面的 24表示就是 255 255 255 0 子网掩码 255 255 255 0 二进制是 11111111 11111111
  • Ant design Pro V5 +Typescript + Hooks + Umi + Dev + SpringBoot + mysql + redis + scrity 实现动态菜单权限管理

    Ant design Pro V5 Typescript Hooks Umi Dev SpringBoot mysql redis scrity 实现动态菜单权限管理 企业中台架构 1 app tsx页面配置 该页面集成了登陆权限控制 动态
  • Android实战系列(三)---级联菜单

    需求A 一级菜单 多级菜单联动 1 在activity上弹出多个pop窗口 达到父菜单与子菜单级联的效果 2 多个Activity页面相互的嵌套实现多级菜单 考虑 传值 数据结构的定义 之前在用前端写Android构造级联菜单出现过标题栏不
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • Finetuner+:为企业实现大模型微调和私有化部署

    如 ChatGPT GPT4 这样的大型语言模型就像是你为公司请的一个牛人顾问 他在 OpenAI Google 等大公司被预训练了不少的行业内专业知识 所以加入你的公司后 你只需要输入 Prompt 给他 介绍一些业务上的背景知识 他就能
  • 2021-01-08

    问题 F 有序数组中插入元素 时间限制 1 Sec 内存限制 128 MB 提交 2116 解决 967 提交 状态 讨论版 题目描述 输入n n lt 20 输入n个有序整数 降序或升序 插入元素e 使新序列仍按原来的排序规则为有序序列
  • 【Java】Java中的String类

    文章目录 一 认识 String 类 二 String 类的常用方法 2 1 构造方法 2 2 String 类对象之间的比较 2 3 字符串查找 2 4 字符串的转换 2 5 字符串替换 2 6 字符串拆分 2 7 字符串截取 2 8 字
  • Java语言 ASCII to Hex 互转(IOT-示例)

    概述 最近想起之前做的IOT项目 使用JAVA写了一个
  • libcurl交叉编译支持https

    简介 libcurl是一个跨平台的网络协议库 支持dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp