Да гранаты у него не той системы
(с) к/ф "Белое солнце пустыни"
Сразу хочу предостеречь желающих пройти этот "квест" до конца - сил у меня выполнить его не хватило :-).
Давно ничего не "компилировав" большое-здоровенное, решил пересобрать библиотеку Qt5 ... на версию, так сказать, по-новее. Ознакомившись на сайте, что бинарный пакет идет сразу с компилятором MinGW с версией GCC 4.8, смело обновил свой с 4.7.2 до 4.8.1. Проделав все подготовительные процедуры, приступил к сборке ICU.... и тут выпала первая сложность - компиляция оборвалась с ошибкой, что не найдено определение "stat",
оказалось, не отрабатывают макросы в stat.h:
оказалось, не отрабатывают макросы в 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 тоже может не спасти.
Предупрежден - значит вооружен ;-).
Запустив компиляцию Qt5, я как обычно подождал пока антивирус отработает вызова qmake, moc, rcc и пошел перечитывать
И т.д. и т.п. ... я не буду приводить перечень всех остановок компиляции, но при подробном разборе оказалось, что большинство из них завязано с тем, что 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 тоже может не спасти.
Предупрежден - значит вооружен ;-).
Вот еще одна прекрасная ошибка из 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)
Доброго времени суток!
УдалитьВы собирали из-под Linux? У меня, к сожалению, мало опыта сборки таких крупных проектов в этой ОС :-).