日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

發(fā)布時(shí)間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在這一系列的前一篇文章學(xué)了C語言,如何為下載狂人寫一個(gè)磁盤剩余容量監(jiān)控程序?中,我們?yōu)橄螺d狂人寫了一個(gè)程序來監(jiān)視磁盤的剩余容量,防止下載的東西撐爆了硬盤。可是,這兩天,他又抱怨他的下載程序不好用,讓我們幫他寫一個(gè)下載程序。

雖然我們學(xué)了C語言,雖說學(xué)了C語言,走遍天下都不怕,但是要想用C語言寫一個(gè)全新的下載程序,對(duì)我們來說,就好比另外一個(gè)二萬五千里長征。雖然技術(shù)上可行,但是在實(shí)際操作中卻是行不通的。誰也不會(huì)傻到去用C語言寫一個(gè)全新的下載程序。那么,到底怎么辦呢?

如果我們看了《C程序設(shè)計(jì)伴侶》的7.A 站在巨人的肩膀上——如何使用已有的函數(shù)庫這個(gè)節(jié),要想解決這個(gè)問題,那簡直就是“灑灑水啦”。在這個(gè)小節(jié)中,我們介紹了如何借助一些已有的函數(shù)庫來幫助我們高質(zhì)量高效率地完成一些常見任務(wù)。而其中介紹的CURL,正好是一個(gè)可以用于網(wǎng)絡(luò)下載的開源函數(shù)庫。

實(shí)際上,CURL有兩種工作方式,其一,它是一個(gè)用URL語法在命令行方式下工作的文件傳輸工具。我們可以使用curl.exe直接在命令行下下載文件。其二,它也是一個(gè)開源的函數(shù)庫,它提供了libcurl這個(gè)函數(shù)庫,其中提供了多個(gè)可以用于處理網(wǎng)絡(luò)事務(wù)(諸如下載,登陸,POST等)的API,利用這些API,我們就可以輕松地完成一個(gè)下載程序,這就好像坐上了飛機(jī),片刻之間,就從江西瑞金到了陜北延安,一步完成二萬五千里長征。

CURL的使用非常簡單,跟其他類似的開源的函數(shù)庫一樣,其使用分為編譯函數(shù)庫和使用函數(shù)庫兩個(gè)步驟。

編譯CURL函數(shù)庫

在這里,我們以在Windows環(huán)境下,利用Visual C++ 2012編譯為例。如果是其他環(huán)境,可以參考其文檔,也很詳盡。

  • 從CURL的官方網(wǎng)站上下載CURL的源代碼包,并解壓得到所有源代碼
  • 接下來的工作就是源代碼編譯成相應(yīng)的函數(shù)庫文件(lib和dll)了。這里有兩種方法:
  • 我們可以采用《C程序設(shè)計(jì)伴侶》中介紹的方法,用Visual Studio打開根目錄下的vc6curl文件,經(jīng)過項(xiàng)目轉(zhuǎn)換后,使用Visual C++ 2012的IDE編譯其中的libcurl項(xiàng)目。
  • 更簡便的,我們還可以在“VS2012開發(fā)人員命令行提示”中,使用nmake來編譯整個(gè)源代碼。
  • 首先是啟動(dòng)位于開始->所有程序->Microsoft Visual Studio 2012->Visual Studio Tools中的命令提示,然后用cd命令進(jìn)入源代碼所在根目錄下的winbuild目錄,比如:???? C:\Program Files\Microsoft Visual Studio 11.0>f:
  • F:\>cd code\curl-7.28.1d\winbuild

    F:\code\curl-7.28.1d\winbuild>

  • 然后,就是使用nmake編譯整個(gè)代碼了:???? nmake /f Makefile.vc mode=dll vc=10????? 其中,mode=dll表示編譯成動(dòng)態(tài)鏈接庫,而vc=10選擇的是Visual C++的版本,本來Visual C++ 2012是vc11,但是CURL不支持,只好用2010的10代替了,編譯也沒有什么問題。
  • 起來倒杯水的時(shí)間,整個(gè)編譯就完成了,編譯結(jié)果保存在???? F:\code\curl-7.28.1d\builds\libcurl-vc10-x86-release-dll-ipv6-sspi-spnego-winssl/????? 目錄下,其中bin保存了可以用于命令行的curl.exe應(yīng)用程序和它用到的libcurl.dll,include目錄是開發(fā)需要用到的頭文件,lib目錄下是需要用到的庫文件。
  • 最后的工作,就是安裝libcurl函數(shù)庫。???? 將/builds/lib/目錄下的文件復(fù)制到編譯器的庫文件目錄,例如,E:\MinGW\lib\????? 將/builds/include/目錄下的文件復(fù)制到編譯器的頭文件目錄,例如,E:\MinGW\include\????? 將/builds/bin/目錄下的libcurl.dll文件復(fù)制到操作系統(tǒng)的動(dòng)態(tài)庫搜索目錄,例如,C:\Windows\System32\????? 或者可執(zhí)行文件所在的目錄????? 當(dāng)然,我們可以通過配置開發(fā)工具來達(dá)到同樣的目的,這里就不贅述了。
  • 如果你嫌自己編譯麻煩,CURL也提供已經(jīng)編譯好的二進(jìn)制文件可以直接下載,不過我還是建議你自己動(dòng)手編譯,畢竟,這是我們每個(gè)程序員都需要掌握的基本功。
  • ?

    至此,整個(gè)編譯安裝過程就算完成了,這樣我們就可以在我們自己的程序中調(diào)用CURL所提供的API來完成文件下載的功能。這就像飛機(jī)已經(jīng)加滿了油,正停在跑道上等待起飛!

    塔臺(tái)塔臺(tái),CL2013次航班準(zhǔn)備完畢,請(qǐng)求起飛。

    現(xiàn)在,我們就可以利用其中提供的API來簡便地實(shí)現(xiàn)一個(gè)系在程序。 /** get.c* 簡易下載程序* Created on: 2013年11月1日11:13:10* Author: Bruce*/#include <curl/curl.h> #include <string.h> //用#pragam comment預(yù)編譯命令,表示這個(gè)程序?qū)⑹褂胠ibcurld_imp.lib這個(gè)文件 #pragma comment(lib,"libcurl.lib")//復(fù)制將數(shù)據(jù)寫入文件的回調(diào)函數(shù),關(guān)于回調(diào)函數(shù),可以參考C程序設(shè)計(jì)伴侶8.5.4小節(jié)介紹 size_t write_data(void * ptr,size_t size,size_t nmemb,FILE * stream) {int written = fwrite(ptr,size,nmemb,stream);return written; }//使用函數(shù)庫所提供函數(shù)實(shí)現(xiàn)文件下載函數(shù) CURLcode download(char * url,char * out) //char * url待下載文件的URL,char * out 下載后的文件名 {CURL * curl = NULL;FILE * fp = NULL;CURLcode res;//調(diào)用函數(shù)庫中的curl_easy_init()函數(shù)完成初始化curl = curl_easy_init();if(curl) //判斷初始化是否成功 {//以二進(jìn)制可寫方式打開文件,保存下載得到的數(shù)據(jù)fp = fopen(out,"wb");//根據(jù)libcurl的使用方法,設(shè)定下載的URL,寫入函數(shù)以及寫入的文件 curl_easy_setopt(curl,CURLOPT_URL,url);curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);curl_easy_setopt(curl,CURLOPT_WRITEDATA,fp);//調(diào)用curl_easy_perform()函數(shù)執(zhí)行下載操作res = curl_easy_perform(curl);//下載完成,進(jìn)行最后的清理工作 curl_easy_cleanup(curl);//關(guān)閉文件 fclose(fp);return res;}else{//如果初始化失敗,返回相應(yīng)的錯(cuò)誤代碼return CURL_FAILED_INIT;} }//輔助函數(shù),用于從URL中獲得文件名 void getfilename(char * url,char * name) {//找到URL中的最后一個(gè)‘/’字符char* pos = strrchr(url,'/');if(NULL != pos){//將URL中文件名(從pos+1開始知道字符串結(jié)束)復(fù)制到name字符串中strcpy(name,pos+1);} }//帶有參數(shù)的主函數(shù),可以讓用戶在執(zhí)行時(shí),直接輸入待下載文件的URL // 例如,如果我們想要下載libcurl的源代碼包,則可以直接輸入: // get http://curl.haxx.se/download/curl-7.24.0.zip // 關(guān)于帶參數(shù)的主函數(shù),可以參考8.7.3小節(jié) int main(int argc,char* argv[]) {//獲取用戶輸入的URL,判斷使用方法是否正確if(2 != argc){// 提示正確的使用方法puts("usage: get http://curl.haxx.se/download/curl-7.24.0.zip");return -1;}//獲取URL中的文件名char* url = argv[1];char name[32] = "";getfilename(url,name);// 調(diào)用函數(shù)庫所提供函數(shù)實(shí)現(xiàn)的download()函數(shù), 完成文件的下載CURLcode res = download(url,name);// 根據(jù)返回結(jié)果,提示用戶下載成功與否if(CURLE_OK == res){printf("great! download %s as %s succesfully.",url,name);}else{printf("sorry:( cannot download %s.",url);}return 0; } 代碼中的注釋已經(jīng)非常詳盡了,這里就不再多加解釋了。如果看完注釋,還是有不明白的地方,或者想更加深入地了解這個(gè)程序, 可以參考《C程序設(shè)計(jì)伴侶》的第七章關(guān)于這個(gè)例子的介紹。 現(xiàn)在,我們可以用如下命令編譯這個(gè)程序: cl /TP get.c 編譯后,得到get.exe,也就是我們?yōu)橄螺d狂人寫的下載程序。(這里的/TP讓你覺得有點(diǎn)不舒服? 那么看看學(xué)了C語言,如何利用cURL寫一個(gè)下載程序?——在MinGW環(huán)境下實(shí)現(xiàn)) 下載程序的開發(fā)簡單,其 使用就更簡單了,比如我們要下載cURL的源代碼, 可以使用下面的命令: get.exe http://curl.haxx.se/download/curl-7.28.1.zip 利用cURL,不到一百行代碼,我們輕松地完成了一個(gè)下載程序,當(dāng)然,如果你有興趣,還可以進(jìn)一步完善,比如加上進(jìn)度提示等等。 這個(gè)事例也告訴我們一個(gè)道理: 學(xué)會(huì)站在巨人的肩膀上,可以收到事半功倍的效果 我們介紹了如何在Windows平臺(tái)的Visual C++環(huán)境下利用cURL快速高效地實(shí)現(xiàn)一個(gè)下載程序。但是有朋友反饋說,“這是在用C++代碼冒充C代碼”。這位朋友說的很有道理,這是因?yàn)?Visual C++對(duì)C語言的支持并不十分完善,為了使用C語言中的一些新特性,我在編譯最終代碼的時(shí)候,加上了一個(gè)/TP選項(xiàng),這實(shí)際上是將.c文件當(dāng)作.cpp文 件來編譯了,也就是把C語言代碼視作了C++代碼。這里需要說明的是,我們?cè)诖a中用到的全是C語言,只是在編譯的時(shí)候采取了一些曲線救國的策略。

    雖然用/TP的方式可以解決問題,但是看起來總有些旁門左道的感覺。幸運(yùn)的是,在Windows平臺(tái)上,不只有Visual C++這一款編譯器,還有其他的C語言編譯器,比如,MInGW就是其中應(yīng)用比較廣泛的一款。利用MinGW,我們同樣可以完成整個(gè)過程,同時(shí)還更加簡 單。

  • 編譯libcurl函數(shù)庫???? 在Visual C++環(huán)境下,我們是使用其nmake程序進(jìn)行編譯,而在MinGW環(huán)境下,我們使用其make程序編譯(這里的前提是MinGW安裝目錄下的bin目錄在系統(tǒng)PATH路徑中)。首先進(jìn)入cURL的源代碼目錄,然后用如下命令編譯:????? make mingw32????? 因?yàn)槲覀冊(cè)谶@里只是使用cURL的基本功能,所以沒有使用其他附加選項(xiàng)。
  • 編譯結(jié)果???? 很快我們就可以得到我們需要的編譯結(jié)果(位于lib目錄下):
    • libcurl.a 靜態(tài)鏈接庫文件?
    • libcurldll.a 動(dòng)態(tài)鏈接庫的導(dǎo)入庫
    • libcurl.dll 動(dòng)態(tài)鏈接庫
    安裝???? MinGW環(huán)境下的安裝同Visual C++環(huán)境下的安裝相似:????? 頭文件:將include目錄下的curl目錄復(fù)制到MinGW的頭文件目錄,比如:E:\MinGW\include????? 庫文件:將上面編譯得到的libcurl.a和libcurldll.a復(fù)制到MinGW的庫文件目錄,比如:E:\MinGW\lib????? dll文件:將上面編譯得到的libcurl.dll復(fù)制到系統(tǒng)PATH目錄,比如,C:\Windows\System32使用???? 仍然使用我們?cè)趯W(xué)了C語言,如何利用cURL寫一個(gè)下載程序?——用cURL提供的API實(shí)現(xiàn)下載中介紹到的get.c文件,用下面的命令進(jìn)行編譯:????? 動(dòng)態(tài)鏈接:gcc –o get.exe get.c –lcurldll????? 靜態(tài)鏈接:gcc –o get.exe get.c –lcurl????? 這樣,我們就得到了下載程序get.exe。

    整體來看,MinGW環(huán)境下libcurl的使用跟在Visual C++環(huán)境下的使用是相似的,只是MinGW對(duì)C語言的支持根據(jù)完善,看起來更加名門正派一些。總之,兩種環(huán)境下都可以實(shí)現(xiàn),而具體使用哪一種,就看你自己的喜好了。

    轉(zhuǎn)自:http://www.howzhi.com/course/3387/lesson/43112

    轉(zhuǎn)載于:https://www.cnblogs.com/kingshow123/p/easydown.html

    總結(jié)

    以上是生活随笔為你收集整理的学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。