Qt,编译libcurl并且导入到库
在MInGW環境下編譯和使用libcurl靜態庫
libcurl 7.21以后的版本在Windows下的編譯比較簡單,自帶了MinGW和VC環境的Makefile文件,首先去Curl官網下載源代碼:http://curl.haxx.se/download.html,任選一個下載即可,推薦這個:?curl-7.21.2.tar.gz,下載完成后解壓開,打開命令行進入curl源碼目錄,(在此之前請先設置好MinGW的環境變量):
cd curl-7.21.2
編譯libcurl庫文件:
cd lib
mingw32-make -f Makefile.m32
等待編譯完成即可
編譯curl可執行文件:
cd ../src
mingw32-make -f Makefile.m32
一會兒就編譯完成了(參考另一鏈接,本人試驗成功的——地址)
{編譯完成后,我們需要復制include頭文件和庫文件到一個目錄供程序開發用
1. 新建curllib目錄
2. 新建curllib/include目錄,將源代碼include目錄里的curl文件夾復制到curllib/include目錄,這些是使用libcurl需要的頭文件
3. 新建curllib/lib目錄,將源代碼lib目錄里編譯好的庫文件libcurl.a,libcurldll.a,libcurl.dll復制到curllib目錄
4. 將MinGW安裝目錄下lib文件夾里的libwldap32.a和libws2_32.a復制到curllib/lib目錄
至此,curllib就是我們開發中要使用到的libcurl的全部文件,下面新建一個測試程序,假設文件名為curltest.c,代碼如下:
—-
010203040506070809101112131415161718#include <stdio.h>#include <curl/curl.h>intmain(void){CURL *curl;CURLcode res;curl = curl_easy_init();if(curl) {curl_easy_setopt(curl, CURLOPT_URL, "www.google.com");res = curl_easy_perform(curl);/* always cleanup */curl_easy_cleanup(curl);}return0;}
—
方法一、命令行編譯使用licurl的程序
假設測試代碼curltest.c位于e:/project
假設curllib文件夾的位置為c:/curllib
命令行運行下列命令編譯這個測試程序:
cd e:/project
gcc -I. -Ic:/curllib/include -g -O2 -DCURL_STATICLIB -c curltest.c
gcc -s -o curltest.exe curltest.o -Lc:/curllib/lib -lcurl -lwldap32 -lws2_32
這時可以看到curltest.c目錄下生成了一個curltest.exe文件
接著在命令行輸入:
curltest.exe
如果看到命令行窗口輸出一些HTML代碼,就表示編譯成功
方法二、Code::Blocks中使用libcurl靜態庫
1. 新建工程,在工程里添加代碼同上的curltest.c文件
2. 將上面curllib/include目錄下的curl文件夾復制到MinGW安裝目錄的include目錄
3. 工程名上右鍵打開Build Options選項,在Compiler Settings選項卡下的#defines里面輸入CURL_STATICLIB,(這表示使用靜態庫)
4. 在Linker Settings選項卡下面的link libraries里添加上面curllib/lib目錄里的四個文件:
C:\curllib\lib\libcurl.a
C:\curllib\lib\libcurldll.a
C:\curllib\lib\libwldap32.a
C:\curllib\lib\libws2_32.a
然后回到工程頁面,點擊Build即可
今天為了編譯和使用libcurl庫折騰了一下午,記下來供需要的人參考,需要注意的是,本文中編譯的是不帶ssl和zlib支持的libcurl,如果需要編譯支持ssl和zlib的curl,還需要先編譯openssl,zlib和libssh,編譯zlib比較簡單,直接使用源碼自帶的makefile文件即可,編譯openssl需要安裝MSYS和Perl,還需要修改一些代碼,libssh的編譯依賴openssl,網上都可以找到方法,也可以看源碼的README文件。參考轉載(地址:http://hi.baidu.com/lifulinghan/item/96f2b7eef7958f245b2d646d)
剛開始的時候我還在糾結動態鏈接庫和靜態鏈接庫,在網上查了一下資料,在windows和linux下都有這兩個概念。
在windows下的動態鏈接庫為.dll,靜態鏈接庫為.lib。
在linux下的動態鏈接庫為.so,靜態鏈接庫為.a。
? ? ? 了解了以上的東西后,再引入一個名稱叫做“導入庫文件(LIB)”,這個東西的后綴也是.lib,但是這個跟windows下的靜態鏈接庫(.lib)是完全不同的概念,我剛開始的時候就在這里蒙了。導入庫文件是跟.dll文件一起用的,可以說是調用.dll的一座橋梁。當然沒有了它也可以通過一些函數去調用它。
? ? ? 在談回qt加載curl庫,我用mingw編譯器去編譯了源代碼,生成三個文件,分別是libcurl.dll,libcurldll.a,libcurl.a。第一個和第三個文件就是動態鏈接庫和靜態鏈接庫,但是第二個是什么呢?我個人認為就是“導入庫文件”,可能因為mingw編譯器本身的因素,它編譯出來的“導入庫文件”的后綴是.a,而且它的格式是“lib”+“動態鏈接庫”+”.a“,這時候我們也許再想,會不會是靜態鏈接庫的“導入庫文件呢”?在網上查過,靜態鏈接庫是不需要導入庫文件的,其實我們從它的名字已經可以看出來了。
? ? 好了,然后再談一下如何在qt上調用這個庫,最方便當然是隱式調用,我做過很多實驗,歸納出以下幾種方法:
? ? 無論是哪一種方法,在.pro文件我們必須要添加頭文件的路徑,如下:
? ?
INCLUDEPATH+=E:/1/web/include
INCLUDEPATH+=E:/1/web/include/curl
方法一:
? ? ? ? ? ? ?先編譯一下得到輸出目錄,然后把libcurl.dll直接復制在輸出目錄的根目錄下,然后在.pro文件里面直接添加??LIBS +="libcurl.dll的路徑",這里說明一下,這種寫法也有兩種,第一種是絕對路徑,第二種就是-L?-L+路徑 l+libcurl,記住是沒有后綴的。
方法二:
? ? ? ? ? ? ?在.pro文件添加以下語句:
? ? ? ? ? ? ?LIBS +=E:/1/web/libcurldll.a,然后把libcurl.dll直接復制在輸出目錄的根目錄下。
? ? ? ? ? ? 這里要說明一下,添加LIBS時,因為添加LIBS有兩種方法,第一種就是上面那種,第二種就是-L+路徑 l+導入庫名字,我個人嘗試過,對于.lib導入庫來說,兩種方法都行,但是對于.a導入庫來說,第二種方法行不通,不知道為啥,如果有人知道請告訴我。所以我還是覺得第一種比較靠譜。
方法三:
? ? ? ? ? 把所有的.dll文件直接放到編譯器的bin目錄下然后在.pro文件添加方法二的路徑。
經過三種方法的嘗試,我覺得第二種方法好一點。
總結
以上是生活随笔為你收集整理的Qt,编译libcurl并且导入到库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装Windows10,Ubuntu双系
- 下一篇: QT导入libcurl