libcurl 支持 openssl 交叉編譯 mips rt5350
By 0 Comment Advertisement
歷經半個月終於把libcurl庫編譯出來,參考網上很多博客,最終把自己要的庫編譯出來。
首先說明一下,我要這個庫的目的。我在RT5350上跑openWRT需要向服務器提交數據,用http協議,且需要ssl加密。經過網上查找只有libcurl合適,於是我用mipsel-openwrt-linux-gcc開始交叉編譯libcurl,
開始的時候一直在CSDN下載 libcurl的源代碼包,版本不一樣裏面Makefile也會有差別,一直報錯,具體錯誤我沒記錄下來可惜,後來我在github找一份比較新的版本curl-7.51.0.tar.gz 最好還是去官網下載 我剛開始可能就是源碼包不對 。經過一星期的折騰終於把這個編譯好了,但是我要支持https所以還需要加openssl,參考博客,
一、用mipsel-openwrt-linux-gcc 編譯libcurl
如果不需要支持ssl的話配置的時候要把 ssl 關了
1.解壓安裝包 tar -xvf curl-7.51.0.tar.gz
2.進入目錄 cd curl-7.51.0
3.配置 ./configure --prefix=/opt/libcurl-lib CC=mipsel-openwrt-linux-gcc --host=mipsel-linux -with-ssl=/opt/openssl-lib/
--prefix後面跟的是你到時候庫要放的地方,就像Linux裝軟件一樣裝在哪裏,由於我不是要在虛擬機運行只要這個庫,所以就選/opt/libcurl-lib這個目錄,到時候下面一步就知道了
CC=這個是配置交叉編譯鏈
--host=mipsel-linux這個網上說是目標機,也就是這個庫到時候編譯出來的程序要運行的那設備,我也不懂
-with-ssl=/opt/openssl-lib/ 這個就是打開ssl, 有的版本默認是打開 有的是默認關閉,自己去看吧哈哈, =/opt/openssl-lib/這個就是你的依賴庫放在哪裏,我就放這了,待會兒會講為啥
4.編譯 make -j4 -j4是為了編譯的時候更快 好像是4核吧
5.安裝(生成庫) make install 經過這一步就會把生成的庫等等放在配置的時候這個裏面--prefix=/opt/libcurl-lib 應該是把源碼包那邊需要的東西拷貝到這裏面
二、上面說了需要依賴庫openssl的庫,那我們一起來編譯OpenSSL吧
源碼包openssl-1.0.1u.tar.gz
先說一下為什麽沒有選擇比較新的版本,因為我用了很多版本,Makefile都有差別為參考博客http://blog.csdn.net/clirus/article/details/50151427
我就選了跟他比較接近的版本,不過他說的“如果是mips交叉編譯,修改完makefile後仍需要將此makefile文件中的-m64 後綴全部去掉。”這個我沒這一步,找不到-m64
1.解壓
2.進入目錄
3.配置 ./config no-asm shared --prefix=/opt/openssl-lib --cross-compile-prefix=mipsel-openwrt-linux-
no-asm 這個我也不太懂 說什麽不依賴匯編啥的吧,不懂不懂就跟著加上去
shared這個是因為需要生成動態庫, 如果不加shared編譯的時候 就不會有 -fPIC,自己去觀察, 但是在編譯libcurl的時候就報錯說什麽編譯的時候沒有-fPIC,我按網上的說的在Makefile修改 加上-fPIC也沒有用 所以還是加上shared吧
--prefix=/opt/openssl-lib 這個前面提到了 就是生成的庫要放到這裏裏面,編譯libcurl的時候依賴庫路徑就要指定到這
--cross-compile-prefix=mipsel-openwrt-linux- 這個就是配置交叉編譯鏈
這上面一、二 順序是顛倒的其實是要編譯OpenSSL,再編譯libcurl
終於編譯出來,哎。。。。。。。。。。
測試程序也上吧
#include <string> using namespace std; FILE *fp; //這個函數是為了符合CURLOPT_WRITEFUNCTION而構造的 //完成數據保存功能 size_t WriteData(void *ptr, size_t size, size_t nmemb, void *stream) { int written = fwrite(ptr, size, nmemb, (FILE *)fp); return written; } int postUrl(char *strUserPassword) { CURL *curl; CURLcode res; struct curl_httppost *post=NULL; struct curl_httppost *last=NULL; string strCredstr = // string strCurlOpt_url = // 自己要連接的服務器地址 if((fp=fopen("/opt/1.txt","w"))==NULL) { printf("fopen( /opt/1.txt) fail\n"); exit(1); } curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL,strCurlOpt_url.c_str()); // 指定url curl_formadd(&post, &last, CURLFORM_COPYNAME, "grant_type",CURLFORM_COPYCONTENTS, strCredstr.c_str(), CURLFORM_END); curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_USERPWD, strUserPassword); //CURLOPT_WRITEFUNCTION 將後繼的動作交給write_data函數處理 //回調函數原型為:size_t function( void *ptr, size_t size, size_t nmemb, void *stream); //函數將在libcurl接收到數據後被調用,因此函數多做數據保存的功能,如處理下載文件。 //CURLOPT_WRITEDATA 用於表明CURLOPT_WRITEFUNCTION函數中的stream指針的來源。 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData); res = curl_easy_perform(curl); printf("%d %s\n",res, curl_easy_strerror(res)); curl_easy_cleanup(curl); } fclose(fp); return 1; } int main(void) { string strUsername = "401f8c403a9447119d722b592b2c9957"; string strPassword = "415d320b18974921b66569d6a89ef369"; char acUserName[1024] = " "; snprintf(acUserName, sizeof(acUserName), "%s:%s",strUsername.c_str(), strPassword.c_str()); curl_global_init(CURL_GLOBAL_SSL); postUrl(acUserName); }
噢對了 還有一點就是要把庫都加進去,在eclipse加庫還有順序,自己去試吧 我也沒法講清,我也不知道為啥。不懂就留言吧
http://www.yaoguangkeji.com/a_7kGzGWn3.html
libcurl 支持 openssl 交叉編譯 mips rt5350