2013-04-12 1 views
2

long stream of obstacles에서 VS2012 컴파일러로 Qt5를 빌드하려고 시도했습니다.VS2012 컴파일러와 함께 Qt5의 32 비트 빌드에서 ICU를 지원하면 Qt5 빌드 오류가 발생합니다. 따라서 Webkit도 빌드 할 수 없습니다.

ICU를 사용할 때 (configure 명령 줄에서 "-icu", VS2012의 ICU가 32 비트 빌드 됨, 모든 ICU 경로 (header, .lib 및 .dll)가 올바르게 포함됨)의 688 행은 이름이 "US-ASCII"인 코덱을 요청할 때 NULL 코덱을 반환합니다 (ICU는 코덱을 반환하지 못합니다). 구체적

는 :

QTextCodec* QTextCodec::codecForLocale() 
{ 
    QCoreGlobalData *globalData = QCoreGlobalData::instance(); 
    if (!globalData) 
     return 0; 

    QTextCodec *codec = globalData->codecForLocale.loadAcquire(); 
    if (!codec) { 
#ifdef QT_USE_ICU 

     // THIS BLOCK IS REACHED WHEN ICU IS ENABLED 

     textCodecsMutex()->lock(); 

     // *** 
     // The following codec returned is NULL!!! 
     // (Internally, it sets the codec name to "US-ASCII", 
     // and fails to find a codec with this name) 
     // *** 
     codec = QIcuCodec::defaultCodecUnlocked(); 

     textCodecsMutex()->unlock(); 
#else 
     // setupLocaleMapper locks as necessary 
     codec = setupLocaleMapper(); 
#endif 
    } 

    return codec; 
} 

나중에 NULL 코덱 변수는 위에서 언급 한 (이하 "lrelease.exe"유틸리티의 코드) 역 참조되고, "lrelease.exe"유틸리티의 일부로 실행될 때 Qt5 빌드 프로세스와 번역 수행을 시도하면이 NULL 역 참조로 인해 충돌하고 오류로 인해 Qt 빌드가 중지됩니다.

위의 코드에서 QIcuCodec::defaultCodecUnlocked() 함수를 실행하면 코덱 이름이 US-ASCII으로 설정되어 있고이 이름을 가진 코덱을 찾을 수 없다는 것을 알 수 있습니다.

그러므로 VS2012- 컴파일러 32 비트 Qt5 빌드로 ICU 지원을 포함하는 것은 불가능한 것처럼 보입니다.

더욱 나쁜 것은 Webkit은 Qt5 내의 ICU에 의존하기 때문에 Webkit도 만들 수 없음을 의미합니다.

누군가 VS2012가있는 Qt5의 버그 일 가능성이 있는지 또는 내 빌드 환경에서 올바르게 설정하지 않는 것이 있는지 알려주실 수 있습니까?

ICT 지원이 활성화 된 VS2012 컴파일러로 Qt5를 빌드 할 수 있는지 여부도 알고 있어야합니다.

나는 또한 posted a comment을 Qt 포럼의 관련 스레드에 포함하고 있습니다.

+0

어떻게 이러한 빌드 문제가 있습니까? 소리가 나에게 런타임에이 문제가있어. 더 나은 현지화 지원을 제공하기 위해 VS2012 CRT가 변경되었습니다. 필요한 winapi 기능이 없기 때문에 XP에서는 작동하지 않습니다. 따라서 테스트 OS에 대해서도 언급하십시오. –

+0

@HansPassant 이것은 복잡한 Qt 빌드 스크립트의 일부로 내부적으로 실행되는 프로그램의 런타임 문제입니다. http://stackoverflow.com/a/15893226/368896 –

+0

@HansPassant (그리고 저는 Windows 7, 64 비트, 그러나 VS2012 컴파일러에서 Qt를 32 비트로 빌드하십시오.) –

답변

5

Qt는 기본값으로 UTF-8을 사용합니다. ICU 51.2를 가정하면 U_CHARSET_IS_UTF8이 1로 정의 된 ICU를 다시 빌드하십시오. # 소스 \ common \ unicode \ platform.h에 정의하십시오 (523 행을 시작하는 주석 참조). 또는 모든 ICU 프로젝트의 빌드에 추가 할 수도 있습니다 allinone.sln에서 (예 : 마우스 오른쪽 버튼을 클릭하고 속성을 선택하고 구성 속성> C/C++> 전 처리기를 선택하여 전 처리기 정의에 추가).

+0

이 답변은 Qt5 종속성 (ICU DLL)의 크기를 줄이는 데 도움이되었습니다. 위의 내용을 정확히 수행 했으므로 언급 된 #define 및 voila - 20MB 미만의 종속성이 적은 ICU를 다시 빌드했습니다. 감사! – sthlm58

관련 문제