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の特定の動作は知っていますか?
問題のコードはどのように(静的にまたは動的に)リンクされていますか?そして、それが構築された同じマシンでコードが実行されていますか?コードは32ビットか64ビットですか? OSは32ビットまたは64ビットで動作していますか? –
失敗したコードは、アプリケーションのメインライブラリに静的にリンクされ、実行可能ファイルに動的にリンクされます。 Cランタイムは動的にリンクされています。これは、gcc 4.4を使用して64ビットWindowsマシンでARM用にクロスコンパイルされたすべての32ビットコードです。 – Marcelo
ああ、ターゲットマシンに適切な 'iconv'ライブラリとインデックスがインストールされていない可能性があります。 '/ usr/lib [64]/gconv'を参照してください。 –