Curl的移植编译以及注意事项
最近需要用curl来发送http请求,遇到了不少问题,查了不少资料,都是零零散散的,现在总结下。
1、移植编译
./configure --prefix=$(PWD)/build --host=arm-XXX-linux;make ;make install
这步基本都没有问题,生成的动态链接库libcurl.a,可以直接给应用程序去使用。
2、API使用
1)全局初始化 curl_global_init(CURL_GLOBAL_ALL);
2)通过curl_easy_init得到一个CURL指针m_pCurl
3)通过curl_formadd封装参数
通过curl_easy_setopt设置各种选项
通过curl_easy_perform执行curl的各种操作
4)curl_easy_getinfo 获得http返回的状态码
5)curl_easy_cleanup释放CURL指针
6)curl_global_cleanup释放全局对象
3、http的响应内容获取
先通过 curl_easy_setopt设置CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA选项
struct CResponseResult
{
int m_iResponseSize; // 响应的实际大小
char* m_p_responseBuffer; // 指向响应内存的指针
}; size_t ReviceData(char *buffer, size_t size, size_t nmemb, CResponseResult & stream)
{ size_t total = size * nmemb;
if (total <= 0 || (stream.m_iResponseSize + total) > MAX_RESPONSE_DATA_BUF_SIZE)
{
return 0;
} memcpy(&stream.m_p_responseBuffer[stream.m_iResponseSize], buffer, total);
stream.m_iResponseSize += total;
return total;
} // 每次发请求前,把buffer清空下
memset(m_ResponseResult.m_p_responseBuffer, 0, MAX_RESPONSE_DATA_BUF_SIZE);
m_ResponseResult.m_iResponseSize = 0;
curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, ReviceData); curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, &m_ResponseResult);
当有响应回来的时候,会触发ReviceData函数,在这个回调函数,会把响应的内容,赋值给out变量,这样响应就取得了。
4、遇到的一些问题
curl_easy_setopt(m_pCurl, CURLOPT_CONNECTTIMEOUT, 4L);
curl_easy_setopt(m_pCurl, CURLOPT_TIMEOUT, 25L);
设置了超时时间后(一个是等待连接的时间,一个是等待接收响应的时间)一旦域名解析失败,程序会莫名的挂掉,而且每次挂掉的地方都不一样。当时也是通过一点一点注释代码,才定位到这两行代码。
coredump的原因是因为curl的DNS解析超时控制是使用SIGALARM实现的。
这样导致发现SIGALARM会出现多线程修改同一个全局变量,由此产生了COREDUMP。
问题发生的前提是设置了CURLOPT_TIMEOUT或CURLOPT_CONNECTTIMEOUT,并且值不为0。
解决办法:
1) 设置CURLOPT_NOSIGNAL的值为1
curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 1);
设置之后,发现的确不会coredump了,但是设置的超时时间没有用了,需要等很久,才能出结果。
2) 使用c-ares(configure时指定参数--enable-ares)
使用这个方法比较好,不会coredump,而且超时时间设置后生效。
下面介绍下这个方法:
a、下载cares的源码,进行编译移植
https://c-ares.haxx.se/
编译方法和curl的编译方法类似,都是通过configure ,最终生成libcares.a
b、修改curl源码里的configure文件
找到下面的代码,添加embedded_ares="yes",箭头所指的地方,不然check
的时候,会报c-ares library defective or too old

c、重新编译curl
./configure --enable-ares=$(PWD)/depends --prefix=$(PWD)/build --host=arm-XXX-linux;make ;make install
这里指定了enable-ares使用的libares所在的目录。depends目录下需要再建立一个子目录lib,在子目录下放入libcares.a即可。
还要把libcares的头文件都拷贝到curl主目录里的lib目录里,这样编译就不会出错了。
Curl的移植编译以及注意事项的更多相关文章
- Qt 5.8 移植编译、测试
/****************************************************************************** * Qt 5.8 移植编译.测试 * 说 ...
- 【计算机视觉】关于OpenCV中GPU配置编译的相关事项
[计算机视觉]关于OpenCV中GPU配置编译的相关事项 标签(空格分隔): [计算机视觉] 前一段发现了OpenCV中关于GPU以及opencl的相关知识,打算升级一下对OpenCV的使用,但是发现 ...
- FFmpeg的Android平台移植—编译篇
摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程. 环境准备: ubuntu-12.04.5 android-ndk64-r10-linux-x86_64. ...
- uboot-2012.04.01移植编译前准备
一:准备移植1.从下面的官网下载uboot-2012.04.012.建立sourceinsight工程 a.解压并在E:\colin weidongshan\transplant_u-boot-201 ...
- Mac openssl 和curl源码编译
1.先编译openssl, 下载源码后解压,终端进入源码目录,输入命令配置编译环境:./Configure darwin64-x86_64-cc 等待配置完成后,输入make 和make insta ...
- libx264开发笔记(一):libx264介绍、海思平台移植编译
前言 在编译ffmpeg时,使用到h264编码时是需要依赖libx264的,本文章是将将libx264作为静态库移植到海思上. 相关博客 <Qt开发笔记之编码x264码流并封装mp4(一 ...
- curl开源库编译
环境:Win7+VS2013 1.下载curl的zip包并解压,本文下载的是curl-7.39.0.zip,下载地址:http://curl.haxx.se/download.html 2.打开vs2 ...
- android 编译代码注意事项
1 安装openjdk1.7 sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-apt update sudo apt-get install op ...
- python 安装预编译库注意事项-pip
一般安装依赖库用pip install 库名 就可以,某些情况下依赖的库需要安装预编译好的, 可以参考pip 安装时的错误信息 下面这个链接中可以直接下载 http://www.lfd.uci.edu ...
随机推荐
- poj 1182 食物链(种类并查集 ‘初心者’)
题目链接:http://poj.org/problem?id=1182 借着这题可以好好理解一下种类并查集,这题比较简单但挺经典的. 题意就不解释了,中问题. 关于种类并查集结局方法也是挺多的 1扩增 ...
- WebStorm调节控制台字体
File --> Settings --> Editor --> Colors & Fonts --> Console Font
- Java微服务(一):dubbo-admin控制台的使用
1.环境准备 使用CentOS7+Docker+Zookeeper3.4.10搭建dubbo微服务 1.1.安装docker容器 (1).uname -r:docker要求CentOS的内核版本高于3 ...
- 自定义Hive UDAF 实现相邻去重
内置的两个聚合函数(UDAF) collect_list():多行字符串拼接为一行collect_set():多行字符串拼接为一行并去重多行字符串拼接为一行并相邻去重UDAF:Concat() con ...
- 十天快速入门Python
课程导学 001 课程定位和目标 002 课程导学 第一部分 Python快速入门 第1天 Python基本语法元素 003 Python基本语法元素 004 程序设计基本方法 005 Python开 ...
- Android开发:为什么我们从来不去感谢开源项目维护者?
今天我想谈一谈,为什么我们很少去感谢开源项目维护者: 一.这样的项目我也可以做啊 “蛤?这项目对我来说也太简单了吧.” “我一周之内就能做一个更好的版本出来.” 确实,很多人都可以在 Hackatho ...
- Lottie在手,动画我有:ios/Android/Web三端复杂帧动画解决方案
为什么需要Lottie 在相对复杂的移动端应用中,我们可能会需要使用到复杂的帧动画.例如: 刚进入APP时候可能会看到的入场小动画,带来愉悦的视觉享受 许多Icon的互动变化比较复杂多变的时候,研 ...
- win7 安装mysql5.7
Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini以及服务无法启动的解决办法以及修改初始密码的方法 LZ初学SQL,本来以为开源的安装很简单,但 ...
- Hive数据导入/导出
1.1 导入/导出规则 EXPORT 命令导出数据表或分区,与元数据一起输出到指定位置.又可以从这个输出位置移动到不同的Hadoop 或Hive 实例中,并且使用IMPORT 命令导入. 当导出一个分 ...
- 超实用的SQL语句之嵌套查询
嵌套查询 什么是嵌套查询 . 嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询. ...