一、libcurl简介
libcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP这些协议,同时支持使用SSL证书的安全文件传输:HTTP POST, HTTP PUT, FTP 上传, 基于HTTP形式的上传、代理、Cookies、用户加密码的认证等多种应用场景。另外,libcurl是一个高移植性的库,能在绝大多数系统上运行,包括Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS等。
二、编译方法(ubuntu环境下)
下载库文件:
libcurl的官网 http://curl.haxx.se/
库下载https:(https://github.com/curl/curl/releases/tag/curl-7_71_
- 解压文件
tar vxf curl-7.71.1.tar.bz2
-
查看README等内容获取安装
第一个框框里面的意思大致就是课把这个安装到自己想要的目录下 -
安装
我这里就把他安装在该目录下自创的_install下
./configure --prefix=$PWD/_install
make
make install
三、Demo测试
访问百度为例
#include <stdio.h>
#include <curl/curl.h>
#define true 1
#define false 0
typedef unsigned int bool;
bool getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储
return false;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: Agent-007");
curl = curl_easy_init(); // 初始化
if (curl)
{
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件
curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件
res = curl_easy_perform(curl); // 执行
if (res != 0) {
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL)
return false;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post内容
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
int main(void)
{
getUrl("/tmp/get.html");
// postUrl("/tmp/post.html");
}
编译指令
gcc demo.c -L ~/httpHandler/curl-7.71.1/_install/lib/ -lcurl
要去下载的库文件里面去找头文件
gcc demo.c -I ~/httpHandler/curl-7.71.1/include/ -L ~/httpHandler/curl-7.71.1/_install/lib/ -lcurl
~/:工作目录,./:是当前目录
-I ~/httpHandler/curl-7.71.1/include/ 表示将~/httpHandler/curl-7.71.1/include/目录作为第一个寻找头文件的目录,件的目录,寻找的顺序是:~/httpHandler/curl-7.71.1/include/-->/usr/include-->/usr/local/include
-L ~/httpHandler/curl-7.71.1/_install/lib/表示将 ~/httpHandler/curl-7.71.1/_install/lib/目录作为第一个寻找库文件的目录,寻找的顺序是/httpHandler/curl-7.71.1/_install/lib/-->/lib/-->/usr/lib/-->/usr/local/lib/
-lcurl表示在上的的lib路径中寻找libcurl.so动态库文件(.a是静态库)
这个错误的原因是因为没有添加环境变量,面向百度即可解决
配置环境变量(根据自己的目录修改)
export LD_LIBRARY_PATH=~/httpHandler/curl-7.71.1/_install/lib/
修改之后就能运行成功了!(这个方法是零时有效,如果需要永久还需重新配置,可参考https://blog.csdn.net/weixin_44234294/article/details/107332180)
总结
通过这次libcurl第三方库的编译方法,其他的第三方库也可以按照这个方法,同时加深了gcc -I -L -l等的相关知识。