1. 程式人生 > >libiconv-1.14.tar.gz在arm上的移植

libiconv-1.14.tar.gz在arm上的移植

通過交叉編譯工具鏈生成arm平臺上的iconv連結庫和標頭檔案
作業系統:centos6.5
libiconv-1.14.tar.gz下載地址:http://download.csdn.net/detail/shanleichicheng/4538600
交叉編譯工具鏈:http://blog.csdn.net/qq_22790049/article/details/52452445

1、解壓原始碼

tar -xzvf libiconv-1.14.tar.gz

2、建立存放編譯生成的資料夾

mkdir /usr/local/icon-arm-linux

3、進入原始碼進行配置

#cd libiconv-1.14
#./configure --host=arm-linux --prefix=/usr/local/iconv-arm-linux

4、編譯

#make
....
#make install
....

5、編譯生成
在配置的時候我們指定了交叉工具鏈和生成路徑
在編譯生成路徑的目錄下,bin目錄為生成的命令,include為生成的標頭檔案,lib為生成的動態連結庫。此時我們就可以運用標頭檔案和動態連結庫進行程式設計了,注意在編譯的時候一定要連結這個動態庫,在執行時將動態庫放入/lib目錄下。

6、在makefiel檔案中使用-liconv呼叫libiconv動態庫檔案時,若出現“error while loading sharedlibraries: libiconv.so.2”錯誤,解決方法為:

$updatedb

$locate libiconv.so.2

發現該庫已經安裝,位置在/usr/local/lib/libiconv.so.2。既然已經安裝,為什麼提示找不到?繼續下一步排查。

strace./indexerindexer調libiconv.so.2/lib/usr/lib/usr/local/lib/usr/libln -s /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2

$ldconfig

7、標頭檔案

#ifndef CODE_CONVERT___H
#define CODE_CONVERT___H #include "iconv.h" /*iconv.h該檔案在編譯庫中,編譯程式時加動態庫*/ #include <string> //#include <iostream> //using namespace std; class code_convert { public: int code_converts(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf, size_t outlen); int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen); int u2g(char *inbuf,size_t inlen,char *outbuf,size_t outlen); protected: private: }; #endif // CODE_CONVERT_H

8、c檔案

#include "code_convert.h"
#include <stdio.h>
#include <string.h>

int code_convert::code_converts(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf, size_t outlen)
{
    iconv_t cd;
    char **pin = &inbuf;
    char **pout = &outbuf;

    cd = iconv_open(to_charset,from_charset);
    if (cd==0){
        printf("iconv_open error!\n");
        return -1;
    }

    memset(outbuf,0,outlen);
    if(iconv(cd,pin,&inlen,pout,&outlen) == -1){
            memcpy(outbuf,inbuf,inlen);
        printf("iconv error!\n");
        return -1;
    }

    iconv_close(cd);
    return 0;
}
//UNICODE
int code_convert::u2g(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
    return code_converts((char *)"utf-8",(char *)"gb2312",(char *)inbuf,inlen,(char *)outbuf,outlen);
}
//GB2312
int code_convert::g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
    return code_converts((char *)"gb2312",(char *)"utf-8",(char *)inbuf,inlen,(char *)outbuf,outlen);
}