参考博客:https://blog.csdn.net/qianghaohao
目录
一:下载并解压:
1.下载:
https://github.com/curl/
2.解压:
sudo tar -zxvf curl-7.66.0.tar.gz -C .
二:编译:
1.进入curl-7.66.0文件夹执行如下指令:
sudo ./buildconf
2.在该目录下创建install_lib文件夹,用于存放生成的头文件和库:
mkdir install_lib
/home/aston/huawei/curl-7.66.0/install_lib
3.配置:
sudo ./configure --prefix=/home/aston/huawei/curl-7.66.0/install_lib --enable-debug
4.编译:
sudo make
sudo make install
5.查看生成的库文件与头文件:
aston@ubuntu:~/huawei/curl-7.66.0/install_lib$ ls include/curl/
curl.h easy.h multi.h system.h urlapi.h
curlver.h mprintf.h stdcheaders.h typecheck-gcc.h
aston@ubuntu:~/huawei/curl-7.66.0/install_lib$ ls lib/
libcurl.a libcurl.la libcurl.so libcurl.so.4 libcurl.so.4.6.0 pkgconfig
6.curl-config工具:
安装完后bin目录下有curl-config工具,可用于查看curl相关配置及版本信息:
aston@ubuntu:~/huawei/curl-7.66.0/install_lib/bin$ ./curl-config --libs
-L/home/aston/huawei/curl-7.66.0/install_lib/lib -lcurl
aston@ubuntu:~/huawei/curl-7.66.0/install_lib/bin$ ./curl-config --version
libcurl 7.66.0
三:测试:
1.代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curl/curl.h>
//#include <curl/types.h>
#include <curl/easy.h>
FILE *fp = NULL; //定义FILE类型指针
//这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的
//完成数据保存功能
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
int written = fwrite(ptr, size, nmemb, (FILE *)fp);
return written;
}
int main(int argc, char *argv[])
{
CURL *curl;
if (argc != 3)
{
fprintf(stderr, "usage: %s url filename\n", argv[0]);
exit(-1);
}
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
if((fp = fopen(argv[2],"w")) == NULL)
{
curl_easy_cleanup(curl);
exit(1);
}
//CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
exit(0);
}
2.编译:
g++ test_curl.cpp -g -I./include -L./lib -lcurl -std=c++11 -o app.out
四:下载网页测试:
1.虚拟机未联网时测试下载百度网页:
./app.out https://www.baidu.com/ index.html
说明:
因为未联网,所以未下载到百度网页,index.html是空文件;
2.虚拟机联网后,下载的是正常的百度网页:
./app.out https://www.baidu.com/ index2.html
说明:
index2.html是正常的网页;
3.其他测试,下载文本文件、图片文件、视频文件;
./app.out http://192.168.107.8:8080/httpserver/http/test1.txt text1.txt
./app.out http://192.168.107.8:8080/httpserver/http/yh.jpg yh.jpg
./app.out http://192.168.107.8:8080/httpserver/http/WeChat_20200305221815.mp4 WeChat_20200305221815.mp4
./app.out https://blog.csdn.net/yanghangwww/article/details/112006433 csdn.html
五:设备不联网的情况下,虚拟机或开发板下载windows搭建的http服务器中的文件:
1.保证虚拟机可以ping通windows:
2.修改http服务器ip为windows的ip:192.168.1.20(直接将原来的192.168.107.8改掉即可)
图:
3.虚拟机或开发板可直接获取http服务器的文件:
4.其他测试:
./app.out http://192.168.1.20:8080/httpserver/http/test1.txt linux_text1.txt
./app.out http://192.168.1.20:8080/httpserver/http/yh.jpg linux_yh.jpg
./app.out http://192.168.1.20:8080/httpserver/http/WeChat_20200305221815.mp4 linux_WeChat_20200305221815.mp4
六:移植到开发板:
1.编译:
sudo tar -zxvf curl-7.66.0.tar.gz -C .
sudo ./buildconf
mkdir install_lib
sudo ./configure --host=arm-linux CC=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-gcc CXX=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-g++ --prefix=/home/aston/huawei_linux/curl-7.66.0/install_lib
sudo make
sudo make install
七:移植时遇到的问题:
1.sudo ./configure后报错:
configure: error: C compiler cannot create executables
原因:看config.log发现是找不到交叉编译工具链:
./configure: line 4261: arm-hisiv300-linux-gcc: command not found
2.查看环境变量:
echo $PATH
/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin:/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin:/opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin:/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
aston@ubuntu:~/huawei_linux/curl-7.66.0$
发现是交叉编译工具链路径不对,少了target:
错误的路径:
CC=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-gcc
正确的路径:
CC=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-gcc
3.若不指明交叉编译工具链的绝对路径也可能会报错:
./configure --host=arm-linux CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++
4.开发板上运行报错:
/mnt/test # ./app.out
./app.out: can't load library 'libcurl.so.4'
原因:找不到库libcurl.so.4
5.查看设备链接库的环境变量:3个都没有:
/mnt/test # echo $LD_LIBRARY_PATH
/usr/local/lib:/usr/lib:/lib
/mnt/test #
6.将libcurl.so.4拷贝到/usr/lib
mv libcurl.so.4 /usr/lib/ -f
7.重新运行,成功:
/mnt/test # ./app.out
[1970-01-01 00:21:10-DBG: app.c:main-1095] yang i = 100
/mnt/test # ls
test_WeChat_20200305221815.mp4
test_test1.txt
test_yh.jpg
八:libcurl编译静态库,需要加-lpthread:
CFLAGS += -g -static
LDFLAGS += -lcurl -std=c++11 -lpthread