RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

libcurl等第三方庫(kù)的通用編譯方法

xCb1_yikoulinux ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:Refuel.CONG ? 2022-06-20 13:38 ? 次閱讀

libcurl簡(jiǎn)介:

libcurl是一個(gè)跨平臺(tái)的網(wǎng)絡(luò)協(xié)議庫(kù),支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協(xié)議。libcurl同樣支持HTTPS證書授權(quán),HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認(rèn)證。libcurl的官網(wǎng) 、庫(kù)下載。這種庫(kù)使用的時(shí)候就像使用wiringPi庫(kù)一樣,編寫完代碼需要鏈接這個(gè)庫(kù),所以要先下載這個(gè)庫(kù)。

libcurl等第三方庫(kù)的通用編譯方法:

  • 首先進(jìn)入libcurl庫(kù)得下載界面,點(diǎn)擊下載libcurl庫(kù)35fab844-f04e-11ec-ba43-dac502259ad0.png
  • 下載完成后通過(guò)共享文件夾或者FileZill或者直接拖拽將壓縮包移動(dòng)到虛擬機(jī)。我這里將壓縮包拖拽至虛擬機(jī)的共享文件夾,然后使用指令:cp /mnt/hgfs/sharefile/curl-7.71.1.tar.bz2 .將壓縮包拷貝到我新建的httpHandler這個(gè)文件夾里面,然后使用指令:tar vxf curl-7.71.1.tar.bz2解壓這個(gè)文件夾,解壓后進(jìn)入文件夾,如下圖所示(之后用到的開源的庫(kù)基本都是這樣的,內(nèi)容形式差不多):360a7306-f04e-11ec-ba43-dac502259ad0.png
  • 那么如何使用這種開源的壓縮包呢?這個(gè)文件夾下面有一個(gè)README文件夾,里面有對(duì)庫(kù)的一些說(shuō)明,如下圖所示,由下圖可知,我們使用libcurl庫(kù)時(shí)可以查看curl.1手冊(cè)或者M(jìn)ANUALdocument這個(gè)手冊(cè)36166b20-f04e-11ec-ba43-dac502259ad0.png
  • 這里我用有道翻譯將這些英文進(jìn)行了簡(jiǎn)單地翻譯:

    自述:Curl是一個(gè)命令行工具,用于傳輸由URL(網(wǎng)址)指定的數(shù)據(jù)語(yǔ)法。通過(guò)閱讀curl了解如何使用curl。手冊(cè)頁(yè)或手冊(cè)文檔。通過(guò)閱讀install了解如何安裝Curl文檔。Libcurl是curl用來(lái)完成其工作的庫(kù)。它很容易可被您的軟件使用。閱讀libcurl。3手冊(cè)頁(yè)學(xué)習(xí)如何!你可以在FAQ文檔中找到最常見問(wèn)題的答案。研究copy文件中的分發(fā)條款和類似條款。如果你分配Curl二進(jìn)制文件或其他涉及l(fā)ibcurl的二進(jìn)制文件,您可能會(huì)喜歡LICENSE-MIXING文檔。所有這些文檔以及更多文檔都可以在docs/目錄中找到。聯(lián)系:如果您有問(wèn)題、疑問(wèn)、想法或建議,請(qǐng)與我們聯(lián)系通過(guò)郵寄到一個(gè)合適的郵寄名單。參見http//curl.haxx.se/mail/該項(xiàng)目的所有貢獻(xiàn)者都列在THANKS文檔中。網(wǎng)站:訪問(wèn)curl網(wǎng)站獲取最新消息和下載//curl.haxx.se/,GIT:要從GIT服務(wù)器上下載最新的源代碼,請(qǐng)這樣做:git克隆https://github.com/curl/curl.git,(您將創(chuàng)建一個(gè)名為curl的目錄,并填充源代碼)。安全問(wèn)題:通過(guò)我們的HackerOne頁(yè)面報(bào)告可疑的安全問(wèn)題,而不是在公共場(chǎng)合!https://hackerone.com/curl請(qǐng)注意:Curl包含的源代碼是版權(quán)所有1998,1999。終于Tekniska Hogskolan。在此附上此通知是為了遵守分布條件。

  • 通過(guò)閱讀README我們并沒(méi)有找到如何使用這個(gè)庫(kù),然后進(jìn)入到docs這個(gè)文件夾,這個(gè)文件夾是對(duì)RADME的一個(gè)補(bǔ)充,在這個(gè)文件夾下面我們會(huì)看到README里面提到的curl1.1這個(gè)API相關(guān)的手冊(cè),還有INSTALL(**==這個(gè)一定要看,有時(shí)候他會(huì)和README都放在解壓后的文件夾里面,有時(shí)候會(huì)放在docs里面==**)。362875fe-f04e-11ec-ba43-dac502259ad0.png
  • 打開INSTALL后看到提示說(shuō)如何編譯(compile)這個(gè)庫(kù)請(qǐng)看INSTALL.md這個(gè)文件,打開這個(gè)文件后,里面有介紹如何安裝編譯后的libcurl庫(kù),然后下面可以看到在UNIX環(huán)境下面如何進(jìn)行安裝如下圖所示,**./config就是配置的一個(gè)東西,就是將庫(kù)安裝到哪里,若后面不跟任何的參數(shù),就是默認(rèn)安裝(可能安裝在/usr/lib或者/usr/include下面)。**==make就是編譯的意思,make install就是將編譯后的東西拷貝到根目錄的相關(guān)文件夾下面。如果默認(rèn)安裝的話可能需要root權(quán)限== 因?yàn)椋耗J(rèn)可能安裝在/usr/lib或者/usr/include下面,而訪問(wèn)這兩個(gè)文件夾需要root權(quán)限。
364107d6-f04e-11ec-ba43-dac502259ad0.png在這里插入圖片描述
  • 當(dāng)然一般不安裝在默認(rèn)的路徑下面,可以通過(guò)下圖方式指定安裝路徑364d6e2c-f04e-11ec-ba43-dac502259ad0.png366a579e-f04e-11ec-ba43-dac502259ad0.png
  • 通過(guò)指令:./configure --help可以查看configure都支持哪些功能參數(shù),其中下面的HOST這個(gè)指令可以指定交叉編譯的編譯器(若不指定交叉編譯工具默認(rèn)使用gcc編譯工具)。3680edd8-f04e-11ec-ba43-dac502259ad0.png
  • 通過(guò)以下指令:./configure --prefix=$PWD/_install進(jìn)行指定位置的安裝,安裝的時(shí)候會(huì)生成一個(gè)_install文件夾,庫(kù)將會(huì)被安裝到這個(gè)文件夾下面,安裝過(guò)程中沒(méi)有出現(xiàn)任何error表示安裝成功,然后使用指令:make進(jìn)行編譯,然后使用使用指令:make install進(jìn)行拷貝,然后會(huì)發(fā)現(xiàn)當(dāng)前文件夾下面生成了一個(gè)_install文件夾,然后進(jìn)入到該文件夾,如下圖所示:
368dd0f2-f04e-11ec-ba43-dac502259ad0.png在這里插入圖片描述

調(diào)用libcurl庫(kù)訪問(wèn)百度

調(diào)用libcurl庫(kù)訪問(wèn)百度主頁(yè)并將數(shù)據(jù)保存到文件中:程序代碼

#include
#include

#definetrue1
#definefalse0
typedefunsignedintbool;

boolgetUrl(char*filename)
{
CURL*curl;
CURLcoderes;
FILE*fp;
if((fp=fopen(filename,"w"))==NULL)//返回結(jié)果用文件存儲(chǔ)
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);//改協(xié)議頭
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主體數(shù)據(jù)輸出到fp指向的文件
res=curl_easy_perform(curl);//執(zhí)行
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內(nèi)容
//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");
}

大概解讀代碼:要用一個(gè)是getUrl,一個(gè)是postUrl,用getpost兩種方法來(lái)請(qǐng)求的一個(gè)網(wǎng)頁(yè)。getUrl,我們來(lái)看一下,是自己封裝的這個(gè)函數(shù),fopen這個(gè)函數(shù)去打開了一個(gè)文件,放在fp這個(gè)流里面。然后curl_easy_init去做初始化,去初始化我們的curl引擎,初始化成功以后curl_easy_setopt去設(shè)置curl相關(guān)的項(xiàng), 包括我們要訪問(wèn)的IP地址等等,還有一個(gè)CURLOPT_WRITEDATA。訪問(wèn)成功數(shù)據(jù)返回以后呢會(huì)把數(shù)據(jù)流導(dǎo)入到這個(gè)filename這個(gè)文件里面,那filename文件是哪里呢?在/tmp/get.html。這文件如果沒(méi)有的話,他這邊fp = fopen(filename, "w")應(yīng)該會(huì)創(chuàng)建啊,去回顧一下文件相關(guān)的操作。然后將返回的 html主體數(shù)據(jù)輸出到fp指向的文件 ,**百度的訪問(wèn)的所有結(jié)果往文件里面去寫**,然后curl_easy_perform執(zhí)行就是在訪問(wèn)百度,如果res != 0,這個(gè)res不等于零是啥意思呢?我們?nèi)セ仡櫼幌轮疤岬降倪@個(gè)進(jìn)行http請(qǐng)求以后的一個(gè)返回值,如果請(qǐng)求成功以后啊,我們?nèi)メ尫胚@相關(guān)的curl的這個(gè)句柄。并且關(guān)閉這個(gè)文件,return true;訪問(wèn)成功,這個(gè)是相關(guān)的步驟

  • 使用指令:gcc demo1.c -I ./curl-7.71.1/_install/include/ -L./curl-7.71.1/_install/lib/ -lcurl進(jìn)行編譯,**-I是指定頭文件的查找路徑,-L是指定庫(kù)文件的查找路徑,同時(shí)還要-l curl,編譯后的執(zhí)行文件在執(zhí)行的時(shí)候出現(xiàn)以下圖中錯(cuò)誤:36d3317e-f04e-11ec-ba43-dac502259ad0.png因?yàn)?/strong>在程序執(zhí)行的時(shí)候,默認(rèn)去/usr/lib去找?guī)?*,然而沒(méi)有找到,所以我們要設(shè)置動(dòng)態(tài)庫(kù)的環(huán)境遍變量:使用指令:export LD_LIBRARY_PATH=庫(kù)的路徑,這種方法臨時(shí)有效,永久生效的環(huán)境變量設(shè)置,編輯/etc/profile即可。也可以修改工作目錄下的.bashrc文件。linux動(dòng)態(tài)庫(kù),靜態(tài)庫(kù)

通過(guò)以上設(shè)置然后再執(zhí)行程序:可以看到/tmp/get.html這個(gè)文件夾里面有從百度網(wǎng)頁(yè)獲取的html代碼:36db22e4-f04e-11ec-ba43-dac502259ad0.png

libcurl庫(kù)函數(shù)介紹:

curl_global_init(long flags)函數(shù):

  • libcurl的使用(其實(shí)和socket編程時(shí)一樣,都需要一定的步驟):
  1. 調(diào)用curl_global_init()初始化libcurl,(就像初始化套接字)
  2. 調(diào)用curl_easy_init()函數(shù)得到 easy interface型指針(這個(gè)指針用來(lái)各種配置)
  3. 調(diào)用curl_easy_setopt()設(shè)置傳輸選項(xiàng)(通過(guò)調(diào)curl_easy_setopt這個(gè)函數(shù)來(lái)對(duì)指針進(jìn)行各種配置,比如:請(qǐng)求的方式)
  4. 根據(jù)curl_easy_setopt()設(shè)置的傳輸選項(xiàng),實(shí)現(xiàn)回調(diào)函數(shù)以完成用戶特定任務(wù)
  5. 調(diào)用curl_easy_perform()函數(shù)進(jìn)行訪問(wèn)請(qǐng)求
  6. 調(diào)用curl_easy_cleanup()釋放內(nèi)存

函數(shù)簡(jiǎn)介

CURLcode curl_global_init(long flags)功能:初始化libcurl 這個(gè)函數(shù)只能用一次。(其實(shí)在調(diào)用curl_global_cleanup 函數(shù)后仍然可再用)如果這個(gè)函數(shù)在curl_easy_init函數(shù)調(diào)用時(shí)還沒(méi)調(diào)用,它將由libcurl庫(kù)自動(dòng)調(diào)用所以多線程下最好主動(dòng)調(diào)用該函數(shù)以防止在線程中curl_easy_init時(shí)多次調(diào)用。

注意:雖然libcurl是線程安全的,但curl_global_init是不能保證線程安全的, 所以不要在每個(gè)線程中都調(diào)用curl_global_init,應(yīng)該將該函數(shù)的調(diào)用放在主線程中。

參數(shù):flags
CURL_GLOBAL_ALL//初始化所有的可能的調(diào)用。
CURL_GLOBAL_SSL//初始化支持安全套接字層。
CURL_GLOBAL_WIN32//初始化win32套接字庫(kù)。
CURL_GLOBAL_NOTHING//沒(méi)有額外的初始化。
  • void curl_global_cleanup(void)函數(shù):結(jié)束libcurl使用的時(shí)候,用來(lái)對(duì)curl_global_init做的工作清理。類似于close的函數(shù)。注意:雖然libcurl是線程安全的,但curl_global_cleanup是不能保證線程安全的,所以不要在每個(gè)線程中都調(diào)用curl_global_init,應(yīng)該將該函數(shù)的調(diào)用放在主線程中。
  • char * curl_version( )函數(shù): 打印當(dāng)前l(fā)ibcurl庫(kù)的版本。
  • CURL * curl_easy_init( )函數(shù):curl_easy_init用來(lái)初始化一個(gè)CURL的指針(有些像返回FILE類型的指針一樣).相應(yīng)的在調(diào)用結(jié)束時(shí)要用url_easy_cleanup函數(shù)清理.一般curl_easy_init意味著一個(gè)會(huì)話的開始.它會(huì)返回一個(gè)easy_handle(CURL*對(duì)象), 一般都用在easy系列的函數(shù)中.
  • void curl_easy_cleanup(CURL * handle) 函數(shù):這個(gè)調(diào)用用來(lái)結(jié)束一個(gè)會(huì)話.與curl_easy_init配合著用.參數(shù): CURL類型的指針.
  • CURLcode curl_easy_setopt(CURL * handle, CURLoption option,parameter)函數(shù):
  • 這個(gè)函數(shù)最重要了.幾乎所有的curl 程序都要頻繁的使用它.它告訴curl庫(kù).程序?qū)⒂腥绾蔚男袨? 比如要查看一個(gè)網(wǎng)頁(yè)的html代碼等.(這個(gè)函數(shù)有些像ioctl函數(shù))

參數(shù):

  1. CURL類型的指針
  2. 各種CURLoption類型的選項(xiàng).(都在curl.h庫(kù)里有定義,man 也可以查看到)
  3. parameter 這個(gè)參數(shù) 既可以是個(gè)函數(shù)的指針,也可以是某個(gè)對(duì)象的指針,也可以是個(gè)long型的變量.它用什么這取決于第二個(gè)參數(shù). CURLoption這個(gè)參數(shù)的取值很多.具體的可以查看man手冊(cè).
  • CURLcode curl_easy_perform(CURL *handle)函數(shù);

    在初始化CURL類型的指針 以及curl_easy_setopt完成后調(diào)用. 就像字面的意思所說(shuō)perform就像是個(gè)舞臺(tái).讓我們?cè)O(shè)置的option 運(yùn)作起來(lái).參數(shù): CURL類型的指針.

原文標(biāo)題:linux中級(jí)——libcurl庫(kù)訪問(wèn)百度

文章出處:【微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209322
  • 百度
    +關(guān)注

    關(guān)注

    9

    文章

    2268

    瀏覽量

    90360
  • Curl
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    8176
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    657

    瀏覽量

    32852

原文標(biāo)題:linux中級(jí)——libcurl庫(kù)訪問(wèn)百度

文章出處:【微信號(hào):yikoulinux,微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    proteus第三方元器件庫(kù)

    本帖最后由 eehome 于 2013-1-5 09:59 編輯 網(wǎng)上找的,_proteus第三方元器件庫(kù)。解壓后直接安裝。
    發(fā)表于 12-05 08:23

    如何加入第三方元件庫(kù)

    最近在做食堂管理系統(tǒng)的仿真,需要向元件庫(kù)中添加第三方元件庫(kù),需要用到SLE4442卡,不知道上哪去下載含此類元件的庫(kù),以及如何添加?
    發(fā)表于 04-21 13:00

    如何把第三方庫(kù)加到PROTEUS中?

    新手求教,弱弱的問(wèn)下,下了一個(gè)第三方庫(kù),說(shuō)是要先安裝,再添加路徑,可是我下來(lái)的第三方庫(kù)沒(méi)有看到安裝文件啊。還望指教如何添加!
    發(fā)表于 06-15 22:32

    關(guān)于proteus第三方元件庫(kù)的問(wèn)題

    下了兩個(gè)第三方元件庫(kù),然后就不知道放哪了,也不知道怎么調(diào)用。百度不到,求大神解答。謝了!
    發(fā)表于 11-13 08:56

    Proteus 第三方元件庫(kù)

    第三方元件庫(kù),基本包含大部分常用元件的,分享給大家。
    發(fā)表于 04-16 22:06

    第三方dll調(diào)用問(wèn)題?。?!

    第三方dll,沒(méi)有.h,labview怎么實(shí)現(xiàn)調(diào)用,dll可以用VS打開,類庫(kù)說(shuō)明也有
    發(fā)表于 05-11 09:14

    proteus第三方元件庫(kù)

    proteus第三方元件庫(kù)
    發(fā)表于 05-26 10:44

    下載python第三方庫(kù)

    python第三方庫(kù)的下載
    發(fā)表于 07-02 13:12

    Keil_C++環(huán)境移植第三方庫(kù)出現(xiàn)類型錯(cuò)誤問(wèn)題怎樣去解決

    Misc 功能,添加--cpp11 即可支持C++??墒窃谝浦惨恍?b class='flag-5'>第三方庫(kù)的時(shí)候會(huì)出現(xiàn)問(wèn)題,比如說(shuō)FreeRTOS、USB庫(kù)等等。如以下編譯錯(cuò)誤:..\OS\FreeRTOS\task
    發(fā)表于 07-16 07:17

    ffmpeg第三方庫(kù)如何在harmony 3.0上編譯跑通?

    該如何編譯,目前是沒(méi)有config.h文件的。因?yàn)榧冃率趾芏嗷A(chǔ)都不懂,之前看過(guò)連老師在openharmony 1.0 上的第三方庫(kù)移植,用的是hi3861,但是我嘗試了一下移植ffmpeg到1.0
    發(fā)表于 12-20 13:16

    在Framework下調(diào)用第三方的C++算法庫(kù)

    我這里是JNI調(diào)用一個(gè)語(yǔ)音處理庫(kù),這些庫(kù)廠商會(huì)以非開源的so庫(kù)文件形式提供。JNI在編譯時(shí)需要依賴它,所以需要先預(yù)編譯安裝
    發(fā)表于 11-24 17:37

    基于微信支付、支付寶支付等第三方支付的Android框架

    基于微信支付、支付寶支付等第三方支付的Android框架
    發(fā)表于 12-17 17:22 ?5次下載

    移動(dòng)應(yīng)用第三方庫(kù)自動(dòng)檢測(cè)和分類

    來(lái)檢測(cè)第三方庫(kù)或者對(duì)其功能進(jìn)行分類,然而,通過(guò)白名單檢測(cè)第三方庫(kù)不完善且不準(zhǔn)確,其原因包括:(1)第三方
    發(fā)表于 12-29 14:35 ?0次下載

    鴻蒙開發(fā)中怎么引入第三方庫(kù)

    Android 發(fā)展到現(xiàn)在不僅提供了很多 API,還提供了很多第三方庫(kù)。這降低了我們開發(fā)者的開發(fā)難度,提升了開發(fā)效率,讓應(yīng)用開發(fā)更加的簡(jiǎn)單高效。 眾所周知,HarmonyOS 除了提供 16000
    的頭像 發(fā)表于 10-11 14:11 ?4057次閱讀

    Cydia起訴蘋果:稱其試圖扼殺Cydia等第三方應(yīng)用商店

    越獄曾是 iPhone 用戶的一堂必修課,如今卻已無(wú)人問(wèn)津。日前,知名越獄商店 Cydia 起訴蘋果,稱蘋果試圖扼殺 Cydia 等第三方應(yīng)用商店。
    的頭像 發(fā)表于 06-01 11:19 ?1527次閱讀
    Cydia起訴蘋果:稱其試圖扼殺Cydia<b class='flag-5'>等第三方</b>應(yīng)用商店
    RM新时代网站-首页