1. 程式人生 > >libcurl 支持 openssl 交叉編譯 mips rt5350

libcurl 支持 openssl 交叉編譯 mips rt5350

lib log txt pyc entry tail 還需 版本 文件中

By admin | 11月18日 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