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 */
}
이 코드는 항상 예외를 throw합니다. 이를 디버깅하기 위해 실패한 코드와 동일한 매개 변수를 사용하는 간단한 버전을 만들었습니다. 내 테스트 코드는 다음과 같습니다
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'를보십시오 –