2012-03-05 9 views
2

WindowsからLinuxに大きなアプリケーションを移植する際に、ワイド文字とマルチバイト文字の間で変換できる必要があります。これを行うには、次のようなコードがあります。Linuxで奇妙なiconv_openの動作

void IConv(const InType* begin, const InType* end, const char* inCode, OutType* outBegin, OutType*& outEnd, const char* outCode) 
{ 
    assert(end >= begin); 
    assert(outEnd > outBegin); 

    iconv_t cd = iconv_open(outCode, inCode); 
    if (cd == reinterpret_cast<iconv_t>(-1)) 
     throw (InvalidLocale()); 
/* blah, blah, blah other code we never reach */ 
} 

このコードは常に例外をスローします。これをデバッグするには、失敗したコードと同じパラメータを使用する単純なバージョンを作成しました。ここに私のテストコードがあります

int main(void) 
{ 

    const char outCode[] = ""; 
    const char inCode[] = "wchar_t"; 

    //Using wchar_t and "" means that iconv will just use the system locale settings. 
    iconv_t cd = iconv_open(outCode, inCode); 
    if (cd == reinterpret_cast<iconv_t>(-1)) 
    { 
     printf("iconv failed to use outCode %s and inCode %s\n",outCode, inCode); 
     return 1; 
    } 

    iconv_close(cd); 
    return 0; 
} 

コードはほとんど同じです。しかし私のテストコードでは、IConv関数は常に失敗するのに対し、失敗は見られません。システム上のロケールは、LANG env変数(この場合は常にISO-8859-1)を介して設定されます。

だから、大きなアプリには現れそうなiconvの特定の動作は知っていますか?

+0

問題のコードはどのように(静的にまたは動的に)リンクされていますか?そして、それが構築された同じマシンでコードが実行されていますか?コードは32ビットか64ビットですか? OSは32ビットまたは64ビットで動作していますか? –

+0

失敗したコードは、アプリケーションのメインライブラリに静的にリンクされ、実行可能ファイルに動的にリンクされます。 Cランタイムは動的にリンクされています。これは、gcc 4.4を使用して64ビットWindowsマシンでARM用にクロスコンパイルされたすべての32ビットコードです。 – Marcelo

+1

ああ、ターゲットマシンに適切な 'iconv'ライブラリとインデックスがインストールされていない可能性があります。 '/ usr/lib [64]/gconv'を参照してください。 –

答えて

2

対象マシンに適切なiconvライブラリとインデックスがインストールされていない可能性があります。 /usr/lib[64]/gconvを参照してください。共有ライブラリは通常、glibcインストールの一部です。 localedefなどのツールで作成できます。