суббота, 5 октября 2013 г.

Квест: собрать Qt 5.1.1 с помощью GCC (MinGW) 4.8.1

Да гранаты у него не той системы
(с) к/ф "Белое солнце пустыни"

Сразу хочу предостеречь желающих пройти этот "квест" до конца - сил у меня выполнить его не хватило :-). 

Давно ничего не "компилировав" большое-здоровенное, решил пересобрать библиотеку Qt5 ... на версию, так сказать, по-новее. Ознакомившись на сайте, что бинарный пакет идет сразу с компилятором MinGW с версией GCC 4.8, смело обновил свой с 4.7.2 до 4.8.1. Проделав все подготовительные процедуры, приступил к сборке ICU.... и тут выпала первая сложность - компиляция оборвалась с ошибкой, что не найдено определение "stat",
оказалось, не отрабатывают макросы в stat.h:

#if !defined(_NO_OLDNAMES) && !defined(__STRICT_ANSI__)
#define stat _stat
#define fstat _fstat

Прямая замена в коде ICU вызовов "stat" на "_stat" решила проблему - библиотека была собрана, но это были лишь подготовительные мероприятия :-))))

Запустив компиляцию Qt5, я как обычно подождал пока антивирус отработает вызова qmake, moc, rcc и пошел перечитывать Maxim библию, а не тут то было. При сборке GUI библиотеки, процесс снова прервался, на этот раз с претензией, что ему не известно ничего о "MemoryBarrier". Казалось бы ... раньше ему было все известно, а теперь нет ... Я тоже ничем помочь ему не мог, мне тоже никто ничего об этом "барьере" не говорил... Но интернет не без фанатичных программистов, нашелся и такой, кто все знает про это. Дай мне сил Вселенная.. войти в их ряды .... :-))). Заменив, опять таки, прямые вызовы "MemoryBarrier" на "__sync_synchronize" дело пошло дальше... Пока снова компилятор не поругался, что "есть не понимать кто это такой" WM_XBUTTONDOWN

И т.д. и т.п. ... я не буду приводить перечень всех остановок компиляции, но при подробном разборе оказалось, что большинство из них завязано с тем, что MinGW определяет ОС как Windows NT 4.0. Понятно дело, что зачастую это делается для "лояльной" для всех версий ОС Windows компиляции программ. Но в данном случае, получалось, что получая на "входе" версию Windows, как NT 4.0, многие макросы "обрубали" "новинки" ... в т.ч. и "MemoryBarrier" и "WM_XBUTTONDOWN"  и т.д. Прямое указание версии ОС в исходнике решало, практически, все возникающие остановки компиляции. С чем это конкретно связано и кого винить, может даже и себя, до конца не стал выяснять - утомительное это оказалось занятие :-). Я поступил как настоящий пользователь и... скачал бинарный пакет - работать то где-то надо :-).

Посему - вам мое предостережение - хотите собрать Qt 5.1.1 - не собирайте его последней версией MinGW, или лучше вообще подождите версию 5.2.0. А тот тут даже старые ошибки стали выползать, а-ля этой, да и компилятор GCC версии 4.7.2 тоже может не спасти

Предупрежден - значит вооружен ;-).

2 комментария:

  1. Вот еще одна прекрасная ошибка из GCC 4.7.2 из-под Qt 5.5.1:
    /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h:417: ошибка: operator '&&' has no right operand
    На сентенцию из заголовка stddef.h:
    #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) \
    || (defined(__cplusplus) && __cplusplus >= 201103L)

    ОтветитьУдалить
    Ответы
    1. Доброго времени суток!

      Вы собирали из-под Linux? У меня, к сожалению, мало опыта сборки таких крупных проектов в этой ОС :-).

      Удалить