2012-03-05 1 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 */ 
} 

이 코드는 항상 예외를 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의 특정 동작을 아는 사람이 있습니까? 그렇지만 간단한 경우가 아닙니다.

+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과 같이 만들 수 있습니다.