<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    11022

    瀏覽量

    207066
  • 百度
    +關注

    關注

    9

    文章

    2211

    瀏覽量

    89145
  • Curl
    +關注

    關注

    0

    文章

    14

    瀏覽量

    8114
  • 編譯
    +關注

    關注

    0

    文章

    624

    瀏覽量

    32459

原文標題: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++??墒窃谝浦惨恍?b class='flag-5'>第三方的時候會出現問題,比如說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
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>