基于libcurl+libopenssl开源库编译出curl下载工具及代码集成curl功能

准备素材:

1. openssl的版本: openssl-1.1.1w.tar.gz

2.curl的版本:curl-8.4.0.tar.gz

目标:

1.编译出openssl库;

2.编译出curl可执行文件及库;

步骤一:先解压压缩包

tar -zxvf openssl-1.1.1w.tar.gz

tar -zxvf curl-8.4.0.tar.gz

步骤二:编译openssl

首先需要配置config:

CC=/home/desheng/asj/ts-sdk/prebuilts/host/gcc/gcc-ts-10.3-2023.2-x86_64-arm-none-linux-uclibcgnueabihf/bin/arm-ts-linux-uclibcgnueabihf-gcc ./config no-asm no-shared no-async --prefix=/home/desheng/asj/libopenssl-out

CC就是编译器的路径, --prefix就是编译出的库文件及可执行文件存放的位置;no-shared表示编译出静态库

no-asm
                   Do not use assembler code. This should be viewed as
                   debugging/trouble-shooting option rather than production.
                   On some platforms a small amount of assembler code may
                   still be used even with this option.

  no-async
                   Do not build support for async operations.

再执行make;由于使用的是32bit的编译器,因此makefile里面产生的-m64需要去掉一下,等待编译完成后再安装,执行make install;

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

步骤三:编译curl库

首先还是需要配置:

CPPFLAGS="-I/home/desheng/asj/libopenssl-out/lib/ -I/home/desheng/asj/libopenssl-out/include" LDFLAGS="-L/home/desheng/asj/libopenssl-out/lib" LIBS="-ldl -lssl -lcrypto" ./configure --host=arm-linux CC=/home/desheng/asj/ts-sdk/prebuilts/host/gcc/gcc-ts-10.3-2023.2-x86_64-arm-none-linux-uclibcgnueabihf/bin/arm-ts-linux-uclibcgnueabihf-gcc CXX=/home/desheng/asj/ts-sdk/prebuilts/host/gcc/gcc-ts-10.3-2023.2-x86_64-arm-none-linux-uclibcgnueabihf/bin/arm-ts-linux-uclibcgnueabihf-g++ --with-ssl --enable-static --disable-dict --disable-ftp --disable-imap --disable-ldap --disable-ldaps --disable-pop3 --disable-proxy --disable-rtsp --disable-smtp --disable-telnet --disable-tftp --disable-zlib --without-ca-bundle --without-gnutls --without-libidn --without-librtmp --without-libssh2 --without-nss --without-zlib --prefix=/home/desheng/asj/libcurl-out/

指定好openssl的头文件,库路径,编译器CC的全路径,CXX也配置上,其他就是一些小配置,--prefix是库文件和可执行文件输出的地方;

配置好,执行make,再执行make install,等待完成即可;

步骤四:放到板子上去跑一下curl

笔者把curl产生的文件都拷贝到SD卡里去,然后去执行,

这样curl工具我们就制作好,可以直接使用了。

如果需要编程的来写下载程序的,可以调用curl的接口

int httpsApiDownloadFile(char *strURL, char *strFileName, https_download_progress_cb progress_cb, https_download_writedata_cb writedata_cb)
{
    int ret = -1;
    if(NULL == strURL) {
        return ret;
    }
    log_d("download %s > %s", strURL, strFileName);
    CURL *download_handle;
    CURLcode imgresult;
    FILE *fp = NULL;
    download_handle = curl_easy_init();
    if(download_handle) {
        fp = fopen(strFileName, "w+");
        if( fp == NULL ) {
            log_e(" File cannot be opened ! \n");
            curl_easy_cleanup(download_handle);
            return ret;
        }
        log_d(" File %s be opened ! \n", strFileName);
        curl_easy_setopt(download_handle, CURLOPT_URL, strURL);
        curl_easy_setopt(download_handle, CURLOPT_TIMEOUT, 100);
        curl_easy_setopt(download_handle, CURLOPT_USE_SSL, CURLUSESSL_ALL);
        curl_easy_setopt(download_handle, CURLOPT_SSL_VERIFYHOST, 0);
        curl_easy_setopt(download_handle, CURLOPT_SSL_VERIFYPEER, 0);
//      curl_easy_setopt(download_handle, CURLOPT_POST, 0);
        curl_easy_setopt(download_handle, CURLOPT_WRITEDATA, fp);
        curl_easy_setopt(download_handle, CURLOPT_NOSIGNAL, 1);
        curl_easy_setopt(download_handle, CURLOPT_FOLLOWLOCATION, 1);
        if(writedata_cb != NULL) {
            curl_easy_setopt(download_handle, CURLOPT_WRITEFUNCTION, writedata_cb);
        } else {
            curl_easy_setopt(download_handle, CURLOPT_WRITEFUNCTION, httpsDownloadWriteCb);
        }
        if(progress_cb != NULL) {
            curl_easy_setopt(download_handle, CURLOPT_NOPROGRESS, 0);
            curl_easy_setopt(download_handle, CURLOPT_PROGRESSFUNCTION, progress_cb);//设置进度回调函数
        } else {
            curl_easy_setopt(download_handle, CURLOPT_NOPROGRESS, 1);
        }
        imgresult = curl_easy_perform(download_handle);
        if(CURLE_OK != imgresult) {
            log_w("Cannot grab the File! \n");
            log_w("curl_easy_perform() failed:(%d) %s\n", imgresult, curl_easy_strerror(imgresult));
            ret = -1;
        } else {
            ret = 0;
        }
        fflush(fp);
        fclose(fp);
    }
    curl_easy_cleanup(download_handle);
    return ret;
}

用代码调用curl接口来下载,可以实时获取进度,更好掌控一点。当然根据自己项目需要来完成吧!怎么方便怎么来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/162106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

风光能互补发电庭院路灯系统技术原理

风光互补发电系统是由风力发电机组配合太阳能电池组件组成,通过专用的控制逆变器,将风力发电机输出的低压交流电整流成直流电,并与光伏电池组件输出的直流电汇集在一起,充入蓄电池组,实现稳压、蓄能和逆变全过程&#…

不动产数据质量提升_电子档案挂接

前言 做了不动产数据质量提升项目,其中包括集体土地所有权档案扫描、挂接。扫描的工作已经完成了,现在需要进行电子档案挂接。正常来说通过不动产系统技术支撑单位的批量挂接功能,但现实是一言难尽。   尝试过进行抓包分析,提交…

MySQL数据库下的Explain命令深度解析

Explain是一个非常有的命令,可以用来获取关于查询执行计划的信息,以及如何解释输出。Explain命令是查看查询优化器如何决定执行查询的主要方法。这个功能有一定的局限性,并不总是会说出真相,但是它的输出是可以获取的最好信息&…

C#单例模式懒汉式与饿汉式

单例模式一般分为懒汉模式和饿汉模式,懒汉式单例在第一次引用时创建实例,不是在类加载时;饿汉式单例模式是一种在类加载时就创建实例的方式,因此也称为静态初始化。 单例模式实现的技巧时构造私有,向外提供静态实例。…

【数据分享】2023年我国省市县三级的独角兽企业数量(Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平!比如一个城市的金融企业较多,那这个城市的金融产业肯定比较发达;一个城市的制造业企业较多,那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

【算法萌新闯力扣】:找到所有数组中消失对数字

力扣热题:找到所有数组中消失对数字 开篇 这两天刚交了蓝桥杯的报名费,刷题的积极性高涨。算上打卡题,今天刷了10道算法题了,题目都比较简单,挑选了一道还不错的题目与大家分享。 题目链接:448.找到所有数组中消失对…

UML统一建模语言

UML包含3种构造块:事物、关系、图。 事物:模型中代表性成分的抽象关系:把事物结合在一起图:聚集了相关的事物 事物 结构事务:模型的静态部分,包括类、接口、协作、用例、主动类、构件、制品、结点 行为事…

【LeetCode刷题-双指针】--16.最接近的三数之和

16.最接近的三数之和 方法&#xff1a;排序双指针 class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int ans nums[0] nums[1] nums[2];for(int i 0;i<nums.length;i){int start i1,end nums.length - 1;while(start < en…

11 月 11 日 ROS 学习笔记——ROS 架构及概念

文章目录 前言一、 ROS 文件系统级1). 工作空间 Ws2). 功能包3). 消息 msg4). 服务 srv 二、计算图级1). 动态加载节点 nodelet2). 主题 topic3). 服务 srv4). 消息 msg5). 试用练习5). 创建工作空间6). 创建 ROS 功能包和元功能包7). 编译ROS功能包8). 使用 ROS 节点9). 使用主…

kubernetes|云原生| 如何优雅的重启和更新pod---pod生命周期管理实务

前言&#xff1a; kubernetes的管理维护的复杂性体现在了方方面面&#xff0c;例如&#xff0c;&#xff50;&#xff4f;&#xff44;的管理&#xff0c;服务的管理&#xff0c;用户的管理&#xff08;&#xff32;&#xff22;&#xff21;&#xff23;&#xff09;&#xf…

linux进程间通信之信号

摘要 本文旨在研究Linux进程间通信的机制之一&#xff1a;信号。信号是由操作系统来处理的&#xff0c;说明信号的处理在内核态。信号不一定会立即被处理&#xff0c;此时会储存在信 号的信号表中。最后&#xff0c;我们会对这种通信方式的优缺点进行全面的分析&#xff0c;并给…

手搓哈希表、列表、队列,只为了用C语言快速求解华容道游戏,我不是大佬,只是一个游戏算法爱好者

背景 多年前曾经写过C语言求解华容道&#xff0c;当时没有用到哈希表&#xff0c;导致整个查重搜索数组过大&#xff0c;每次求解都得花上数分钟的时间&#xff0c;如今时过境迁&#xff0c;对数据结构和算法有了更深的理解&#xff0c;所以得把这一块补上了。(其实就是最近想…

POSIX信号量

POSIX信号量 POSIX信号量用于同步操作&#xff0c;达到无冲突访问临界资源的目的&#xff0c;可以用于线程之间的通信。而信号量的本质其实就是一把计数器&#xff01;&#xff01;而我们对计数器有2个操作&#xff0c;一个是增加计数器的值&#xff0c;一个是减少计数器的值。…

MySQL/Oracle用逗号分割的id怎么实现in (逗号分割的id字符串)。find_in_set(`id`, ‘1,2,3‘) 函数,

1.MySQL 1.1.正确写法 select * from student where find_in_set(s_id, 1,2,3); 1.2.错误示范 select * from student where find_in_set(s_id, 1,2 ,3); -- 注意&#xff0c;中间不能有空格。1、3 select * from student where find_in_set(s_id, 1,2, 3); -- 注意…

Nginx安装配置与SSL证书安装部署

一、Nginx Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;被广泛用于构建现代化的Web应用和提供静态内容。 nginx官网 这里下载nginx-1.24.0-zip Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;被广泛用于构建现代化的Web应用和提供静态内…

腾讯云新用户专享买什么服务器划算?腾讯云新用户服务器购买建议

腾讯云近期推出了一系列的轻量应用服务器活动&#xff0c;其中包括了两款三年时长的优惠配置。这两款配置分别是2核2G4M和2核4G5M&#xff0c;价格分别为540元和756元。相较于按月购买的费用&#xff0c;三年时长的套餐更加划算&#xff0c;并且能够有效省下续费费用。所以&…

【LeetCode刷题-滑动窗口】-- 239.滑动窗口最大值

239.滑动窗口最大值 分析&#xff1a; 方法&#xff1a;优先队列 对于最大值&#xff0c;可以使用优先队列(堆)&#xff0c;其中的大根堆可以帮助实时维护一系列元素中的最大值 在本题中&#xff0c;初始时&#xff0c;将数组nums的前k个元素放入优先队列中&#xff0c;每当我…

【JavaEE初阶】 CSS的引入方式和选择器

文章目录 &#x1f332;CSS是什么&#xff1f;&#x1f340;CSS基础语法规范&#x1f384;引入方式&#x1f6a9;内部样式表&#x1f6a9;行内样式表&#x1f6a9;外部样式 &#x1f334;代码风格&#x1f333;选择器&#x1f6a9;选择器的种类&#x1f6eb;基础选择器&#x1…

【代码随想录】算法训练计划23

1、669. 修剪二叉搜索树 题目&#xff1a; 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&…

Windows安装Java环境(OracleJDK)

在下载之前&#xff0c;我们先了解一下java的前世今生 1991年&#xff1a;Java 的前身 Oak 由 James Gosling 和他的团队在 Sun Microsystems 公司开发。1995年&#xff1a;Oak 更名为 Java&#xff0c;并在同年发布。Java 1.0 版本正式推出。1996年&#xff1a;Sun Microsyst…