37.linux安装libcurl库:和hfs搭建的的http服务器进行数据交互

参考博客: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 

猜你喜欢

转载自blog.csdn.net/yanghangwww/article/details/113059590