0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

libcurl等第三方库的通用编译方法

xCb1_yikoulinux 来源:CSDN技术社区 作者:Refuel.CONG 2022-06-20 13:38 次阅读

libcurl简介:

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。libcurl的官网 、库下载。这种库使用的时候就像使用wiringPi库一样,编写完代码需要链接这个库,所以要先下载这个库。

libcurl等第三方库的通用编译方法:

  • 首先进入libcurl库得下载界面,点击下载libcurl库35fab844-f04e-11ec-ba43-dac502259ad0.png
  • 下载完成后通过共享文件夹或者FileZill或者直接拖拽将压缩包移动到虚拟机。我这里将压缩包拖拽至虚拟机的共享文件夹,然后使用指令:cp /mnt/hgfs/sharefile/curl-7.71.1.tar.bz2 .将压缩包拷贝到我新建的httpHandler这个文件夹里面,然后使用指令:tar vxf curl-7.71.1.tar.bz2解压这个文件夹,解压后进入文件夹,如下图所示(之后用到的开源的库基本都是这样的,内容形式差不多):360a7306-f04e-11ec-ba43-dac502259ad0.png
  • 那么如何使用这种开源的压缩包呢?这个文件夹下面有一个README文件夹,里面有对库的一些说明,如下图所示,由下图可知,我们使用libcurl库时可以查看curl.1手册或者MANUALdocument这个手册36166b20-f04e-11ec-ba43-dac502259ad0.png
  • 这里我用有道翻译将这些英文进行了简单地翻译:

    自述:Curl是一个命令行工具,用于传输由URL(网址)指定的数据语法。通过阅读curl了解如何使用curl。手册页或手册文档。通过阅读install了解如何安装Curl文档。Libcurl是curl用来完成其工作的库。它很容易可被您的软件使用。阅读libcurl。3手册页学习如何!你可以在FAQ文档中找到最常见问题的答案。研究copy文件中的分发条款和类似条款。如果你分配Curl二进制文件或其他涉及libcurl的二进制文件,您可能会喜欢LICENSE-MIXING文档。所有这些文档以及更多文档都可以在docs/目录中找到。联系:如果您有问题、疑问、想法或建议,请与我们联系通过邮寄到一个合适的邮寄名单。参见http//curl.haxx.se/mail/该项目的所有贡献者都列在THANKS文档中。网站:访问curl网站获取最新消息和下载//curl.haxx.se/,GIT:要从GIT服务器上下载最新的源代码,请这样做:git克隆https://github.com/curl/curl.git,(您将创建一个名为curl的目录,并填充源代码)。安全问题:通过我们的HackerOne页面报告可疑的安全问题,而不是在公共场合!https://hackerone.com/curl请注意:Curl包含的源代码是版权所有1998,1999。终于Tekniska Hogskolan。在此附上此通知是为了遵守分布条件。

  • 通过阅读README我们并没有找到如何使用这个库,然后进入到docs这个文件夹,这个文件夹是对RADME的一个补充,在这个文件夹下面我们会看到README里面提到的curl1.1这个API相关的手册,还有INSTALL(**==这个一定要看,有时候他会和README都放在解压后的文件夹里面,有时候会放在docs里面==**)。362875fe-f04e-11ec-ba43-dac502259ad0.png
  • 打开INSTALL后看到提示说如何编译(compile)这个库请看INSTALL.md这个文件,打开这个文件后,里面有介绍如何安装编译后的libcurl库,然后下面可以看到在UNIX环境下面如何进行安装如下图所示,**./config就是配置的一个东西,就是将库安装到哪里,若后面不跟任何的参数,就是默认安装(可能安装在/usr/lib或者/usr/include下面)。**==make就是编译的意思,make install就是将编译后的东西拷贝到根目录的相关文件夹下面。如果默认安装的话可能需要root权限== 因为:默认可能安装在/usr/lib或者/usr/include下面,而访问这两个文件夹需要root权限。
364107d6-f04e-11ec-ba43-dac502259ad0.png在这里插入图片描述
  • 当然一般不安装在默认的路径下面,可以通过下图方式指定安装路径364d6e2c-f04e-11ec-ba43-dac502259ad0.png366a579e-f04e-11ec-ba43-dac502259ad0.png
  • 通过指令:./configure --help可以查看configure都支持哪些功能参数,其中下面的HOST这个指令可以指定交叉编译的编译器(若不指定交叉编译工具默认使用gcc编译工具)。3680edd8-f04e-11ec-ba43-dac502259ad0.png
  • 通过以下指令:./configure --prefix=$PWD/_install进行指定位置的安装,安装的时候会生成一个_install文件夹,库将会被安装到这个文件夹下面,安装过程中没有出现任何error表示安装成功,然后使用指令:make进行编译,然后使用使用指令:make install进行拷贝,然后会发现当前文件夹下面生成了一个_install文件夹,然后进入到该文件夹,如下图所示:
368dd0f2-f04e-11ec-ba43-dac502259ad0.png在这里插入图片描述

调用libcurl库访问百度

调用libcurl库访问百度主页并将数据保存到文件中:程序代码

#include
#include

#definetrue1
#definefalse0
typedefunsignedintbool;

boolgetUrl(char*filename)
{
CURL*curl;
CURLcoderes;
FILE*fp;
if((fp=fopen(filename,"w"))==NULL)//返回结果用文件存储
returnfalse;
structcurl_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);
returntrue;
}
}
boolpostUrl(char*filename)
{
CURL*curl;
CURLcoderes;
FILE*fp;
if((fp=fopen(filename,"w"))==NULL)
returnfalse;
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);
returntrue;
}
intmain(void)
{
getUrl("/tmp/get.html");
postUrl("/tmp/post.html");
}

大概解读代码:要用一个是getUrl,一个是postUrl,用getpost两种方法来请求的一个网页。getUrl,我们来看一下,是自己封装的这个函数,fopen这个函数去打开了一个文件,放在fp这个流里面。然后curl_easy_init去做初始化,去初始化我们的curl引擎,初始化成功以后curl_easy_setopt去设置curl相关的项, 包括我们要访问的IP地址等等,还有一个CURLOPT_WRITEDATA。访问成功数据返回以后呢会把数据流导入到这个filename这个文件里面,那filename文件是哪里呢?在/tmp/get.html。这文件如果没有的话,他这边fp = fopen(filename, "w")应该会创建啊,去回顾一下文件相关的操作。然后将返回的 html主体数据输出到fp指向的文件 ,**百度的访问的所有结果往文件里面去写**,然后curl_easy_perform执行就是在访问百度,如果res != 0,这个res不等于零是啥意思呢?我们去回顾一下之前提到的这个进行http请求以后的一个返回值,如果请求成功以后啊,我们去释放这相关的curl的这个句柄。并且关闭这个文件,return true;访问成功,这个是相关的步骤

  • 使用指令:gcc demo1.c -I ./curl-7.71.1/_install/include/ -L./curl-7.71.1/_install/lib/ -lcurl进行编译,**-I是指定头文件的查找路径,-L是指定库文件的查找路径,同时还要-l curl,编译后的执行文件在执行的时候出现以下图中错误:36d3317e-f04e-11ec-ba43-dac502259ad0.png因为在程序执行的时候,默认去/usr/lib去找库**,然而没有找到,所以我们要设置动态库的环境遍变量:使用指令:export LD_LIBRARY_PATH=库的路径,这种方法临时有效,永久生效的环境变量设置,编辑/etc/profile即可。也可以修改工作目录下的.bashrc文件。linux动态库,静态库

通过以上设置然后再执行程序:可以看到/tmp/get.html这个文件夹里面有从百度网页获取的html代码:36db22e4-f04e-11ec-ba43-dac502259ad0.png

libcurl库函数介绍:

curl_global_init(long flags)函数:

  • libcurl的使用(其实和socket编程时一样,都需要一定的步骤):
  1. 调用curl_global_init()初始化libcurl,(就像初始化套接字)
  2. 调用curl_easy_init()函数得到 easy interface型指针(这个指针用来各种配置)
  3. 调用curl_easy_setopt()设置传输选项(通过调curl_easy_setopt这个函数来对指针进行各种配置,比如:请求的方式)
  4. 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务
  5. 调用curl_easy_perform()函数进行访问请求
  6. 调用curl_easy_cleanup()释放内存

函数简介

CURLcode curl_global_init(long flags)功能:初始化libcurl 这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用)如果这个函数在curl_easy_init函数调用时还没调用它将由libcurl库自动调用所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。

注意:虽然libcurl是线程安全的,但curl_global_init是不能保证线程安全的, 所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。

参数:flags
CURL_GLOBAL_ALL//初始化所有的可能的调用。
CURL_GLOBAL_SSL//初始化支持安全套接字层。
CURL_GLOBAL_WIN32//初始化win32套接字库。
CURL_GLOBAL_NOTHING//没有额外的初始化。
  • void curl_global_cleanup(void)函数:结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。注意:虽然libcurl是线程安全的,但curl_global_cleanup是不能保证线程安全的,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。
  • char * curl_version( )函数: 打印当前libcurl库的版本。
  • CURL * curl_easy_init( )函数:curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样).相应的在调用结束时要用url_easy_cleanup函数清理.一般curl_easy_init意味着一个会话的开始.它会返回一个easy_handle(CURL*对象), 一般都用在easy系列的函数中.
  • void curl_easy_cleanup(CURL * handle) 函数:这个调用用来结束一个会话.与curl_easy_init配合着用.参数: CURL类型的指针.
  • CURLcode curl_easy_setopt(CURL * handle, CURLoption option,parameter)函数:
  • 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.(这个函数有些像ioctl函数)

参数:

  1. CURL类型的指针
  2. 各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)
  3. parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数. CURLoption这个参数的取值很多.具体的可以查看man手册.
  • CURLcode curl_easy_perform(CURL *handle)函数;

    在初始化CURL类型的指针 以及curl_easy_setopt完成后调用. 就像字面的意思所说perform就像是个舞台.让我们设置的option 运作起来.参数: CURL类型的指针.

原文标题:linux中级——libcurl库访问百度

文章出处:【微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206725
  • 百度
    +关注

    关注

    9

    文章

    2170

    浏览量

    88920
  • Curl
    +关注

    关注

    0

    文章

    14

    浏览量

    8082
  • 编译
    +关注

    关注

    0

    文章

    614

    浏览量

    32374

原文标题:linux中级——libcurl库访问百度

文章出处:【微信号:yikoulinux,微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview如何内嵌操作第三方EXE程序!

    自己在网上搜了下相关资料,能把第三方EXE内嵌进入容器里,但是有个问题,这个第三方软件必须手动拖到容器正中间,手动最大化。请问有什么方法可以自动实现吗? 下图是我内嵌的POLL 软件。如图!
    发表于 04-18 14:26

    proteus第三方元器件

    本帖最后由 eehome 于 2013-1-5 09:59 编辑 网上找的,_proteus第三方元器件。解压后直接安装。
    发表于 12-05 08:23

    如何加入第三方元件

    最近在做食堂管理系统的仿真,需要向元件中添加第三方元件,需要用到SLE4442卡,不知道上哪去下载含此类元件的,以及如何添加?
    发表于 04-21 13:00

    如何把第三方加到PROTEUS中?

    新手求教,弱弱的问下,下了一个第三方,说是要先安装,再添加路径,可是我下来的第三方没有看到安装文件啊。还望指教如何添加!
    发表于 06-15 22:32

    关于proteus第三方元件的问题

    下了两个第三方元件,然后就不知道放哪了,也不知道怎么调用。百度不到,求大神解答。谢了!
    发表于 11-13 08:56

    Proteus 第三方元件

    第三方元件,基本包含大部分常用元件的,分享给大家。
    发表于 04-16 22:06

    第三方dll调用问题!!!

    第三方dll,没有.h,labview怎么实现调用,dll可以用VS打开,类说明也有
    发表于 05-11 09:14

    LabVIEW与第三方软件交互问题

    现在做一个软件,就是通过LabVIEW去与第三方软件进行交互操作!已经通过百度找到了利用user32.dll调用FindWindowA与PostMessage去实现对计算器,找了多方资料也没有找到解决办法。想做一个软件就是对图片2中第三方软件中控件进行控制的
    发表于 12-26 17:13

    proteus第三方元件

    proteus第三方元件
    发表于 05-26 10:44

    下载python第三方

    python第三方的下载
    发表于 07-02 13:12

    国内知名第三方检测认证机构排名

    第三方检测机构国内起步的很晚,基本是2000年以后的事情,进入改革开放以来,特别是新世纪以来,国家对第三方机构的政策越来越放开了,很多职能部门都逐步下放到第三方机构来做。为了保证产品品质,就有
    发表于 07-19 16:57

    Keil_C++环境移植第三方出现类型错误问题怎样去解决

    Misc 功能,添加--cpp11 即可支持C++。可是在移植一些第三方的时候会出现问题,比如说FreeRTOS、USB等等。如以下编译错误:..\OS\FreeRTOS\task
    发表于 07-16 07:17

    头文件中包含第三方文件

    macrocmake如果源文件(例如 CPP)中包含第三方头文件,但是头文件(例如 hpp)中不包含该第三方文件头,采用 PRIVATE。如果源文件和头文件中都包含该第三方文件头,采用 PUBLIC
    发表于 08-18 08:10

    ffmpeg第三方如何在harmony 3.0上编译跑通?

    该如何编译,目前是没有config.h文件的。因为纯新手很多基础都不懂,之前看过连老师在openharmony 1.0 上的第三方移植,用的是hi3861,但是我尝试了一下移植ffmpeg到1.0
    发表于 12-20 13:16

    在Framework下调用第三方的C++算法库

    我这里是JNI调用一个语音处理,这些厂商会以非开源的so文件形式提供。JNI在编译时需要依赖它,所以需要先预编译安装
    发表于 11-24 17:37