Портируя мой проект с Qt4 на Qt5.1, я получаю эту ошибку из файла Qt:
C:\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtGui\qopenglversionfunctions.h:785: error: expected unqualified-id before ')' token
void (QOPENGLF_APIENTRYP MemoryBarrier)(GLbitfield barriers);
^
Это цепочка определений:
#define QOPENGLF_APIENTRYP QOPENGLF_APIENTRY *
#define QOPENGLF_APIENTRY APIENTRY
#define APIENTRY WINAPI
#define WINAPI __stdcall
Я заметил, что токен MemoryBarrier присутствует в библиотеке libQt5OpenGLExtensionsd.a. Должен ли я включить его, даже если в исходном проекте Qt4 не использовалось ничего, связанного с OpenGL?
Платформа:
Windows 7
MinGW 4.8
Qt 4.8 -> Qt 5.1
Я заметил, что токен MemoryBarrier присутствует в
Библиотека libQt5OpenGLExtensionsd.a. Должен ли я включить его, даже если в
оригинальный проект Qt4 ничего не связанного с OpenGL был использован?
Нет, это не связано. OpenGLExtension компилируется после QtGui.
К сожалению, вы поражаетесь тем, что в Windows уже определен MemoryBarrier (), и, следовательно, существует конфликт между этим и тем, что имеет qt. Вы можете найти официальную документацию по Windows для этого:
http://msdn.microsoft.com/en-us/library/windows/apps/ms684208(v=vs.85).aspx
Я только что обсудил это с Гуннаром, сопровождающим QtGui, и я планирую внести изменения в Gerrit для решения вашей проблемы.
Мы использовали что-то подобное в нашем проекте пару лет назад, когда писали поточно-ориентированные синглтоны на основе QtCore:
#if defined __GNUC__ && __GNUC__ >= 4 && __GNUC_MINOR__ >= 4
#define __MEMBARRIER __sync_synchronize();
#elif defined _MSC_VER && defined _WIN64
#define __MEMBARRIER MemoryBarrier();
#else
#define __MEMBARRIER
#endif
Qt может понадобиться проверить ifdef MINGW / GCC / VERSION и undef определить MemoryBarrier.
РЕДАКТИРОВАТЬ: Это было исправлено около полугода назад. Подробности смотрите в следующем обзоре Gerrit и соответствующем отчете об ошибке:
https://codereview.qt-project.org/#change,68156
а также
https://bugreports.qt.io/browse/QTBUG-34080
Итак, обновитесь до Qt 5.2.0 и все заработает. В противном случае вы можете попытаться сделать бэкпорт.
Кроме ошибка в MinGW 4.8.1 с uint64_t в io.h, в QT 5.2.1 также есть этот. Я столкнулся с этим сегодня, когда пытался скомпилировать QT 5.2.1 с MinGW 4.8.1, так что я решил опубликовать свое решение.
Я не знаю, каким будет официальное исправление для QT, но для своих нужд я сделал это так:
в строке 49 src / gui / opengl / qopengl.h:
// Windows always needs this to ensure that APIENTRY gets defined
#if defined(Q_OS_WIN)
# include <QtCore/qt_windows.h>
#endif
Я просто не определил макрос Windows MemoryBarrier там:
// Windows always needs this to ensure that APIENTRY gets defined
#if defined(Q_OS_WIN)
# include <QtCore/qt_windows.h>
# undef MemoryBarrier
#endif
Я сталкиваюсь с той же проблемой. Я мог бы скомпилировать и запустить, просто закомментировав проблемную строку:
// void (QOPENGLF_APIENTRYP MemoryBarrier)(GLbitfield barriers);
В файле C: /Qt/Qt5.1.1/5.1.1/mingw48_32/include/QtGui/qopenglversionfunctions.h: 785
Мое приложение не использует никаких материалов OpenGL. Будем надеяться, что они скоро это исправят 😉
Поскольку принятый ответ, кажется, не помогает, когда кто-то пытается собрать библиотеку QT самостоятельно, и Ласло Пап утверждает, что другое решение не является правильным, я попытался найти способ исправить это правильно. В Google я нашел пост, где говорилось, что MemoryBarrier
не реализован в MingW и для него был патч.
Поэтому я попытался включить исправление в opengl.h
и надеемся, что это правильный путь, поскольку простое комментирование строк может вызвать проблемы в дальнейшем.
#ifndef QT_NO_OPENGL
// Windows always needs this to ensure that APIENTRY gets defined
#if defined(Q_OS_WIN)
# include <QtCore/qt_windows.h>
#if defined(__MINGW32__) && defined(MemoryBarrier)
#undef MemoryBarrier
__CRT_INLINE void MemoryBarrier(void)
{
long Barrier = 0;
__asm__ __volatile__("xchgl %%eax,%0 ":"=r" (Barrier));
}
#endif
#endif