2013-04-12 3 views
2

Я столкнулся с другим в long stream of obstacles попытке построить Qt5 с VS2012 компилятором.Поддержка ICU в 32-битной сборке Qt5 с компилятором VS2012 вызывает отказ сборки Qt5; Webkit также поэтому unbuildable

Когда ICU включен («-icu» в командной строке configure, а также надлежащая 32-разрядная сборка ICU в VS2012 и правильное включение всех путей ICU (заголовок, .lib и .dll)), Строка 688 из qtbase\src\corelib\codecs\qtextcodec.cpp возвращает NULL-кодек (ICU не может вернуть кодек) при запросе кодека с именем «US-ASCII».

В частности:

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 и что кодек с этим именем не найден.

Поэтому представляется невозможным включить поддержку ICU с 32-разрядной сборкой Qt5 с VS2012-компилятором.

Хуже, потому что Webkit зависит от ICU в пределах Qt5, это значит, что Webkit не может быть построен.

Может кто-нибудь скажет мне, может ли это быть ошибкой с Qt5 с VS2012, или есть что-то, что я неправильно настраиваю в своей среде сборки?

Использовать также было бы знать, сможет ли кто-нибудь построить Qt5 с помощью компилятора VS2012 с поддержкой ICU.

У меня также есть posted a comment в соответствующей, текущей теме на форуме Qt.

+0

Как возникают проблемы с сборкой? Звучит для меня, что у вас эта проблема во время работы. В VS2012 CRT было внесено изменение, чтобы обеспечить лучшую поддержку локализации. Что не будет работать на XP, потому что у него нет необходимых функций winapi. Так что также упоминайте свою тестовую ОС. –

+0

@HansPassant Это проблема времени выполнения для программы, которая выполняется внутренне как часть сложного скрипта сборки Qt: http://stackoverflow.com/a/15893226/368896 –

+0

@HansPassant (и я строю/запускаю Windows 7, 64-разрядная, но построение Qt как 32-бит под компилятором VS2012.) –

ответ

5

Qt использует UTF-8 по умолчанию. Предполагая, что ICU 51.2 перестроит ICU с U_CHARSET_IS_UTF8, определенным для 1. Либо: #define его в source \ common \ unicode \ platform.h (см. Комментарий, начинающийся примерно по строке 523), или вы также можете добавить его в сборку во всех проектах ICU в allinone.sln (например, щелкните правой кнопкой мыши, выберите свойства, выберите «Свойства конфигурации> C/C++> Препроцессор и добавьте его в определения препроцессора).

+0

Этот ответ помог мне уменьшить размер зависимостей Qt5 (DLL ICU). Я сделал именно то, что было выше, то есть восстановил ICU с указанным #define и voila - меньше 20 Мбайт зависимостей. Благодаря! – sthlm58

 Смежные вопросы

  • Нет связанных вопросов^_^