Ошибка времени компиляции из файла Qt: ожидаемый неквалифицированный идентификатор перед токеном ‘)’

Портируя мой проект с 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

4

Решение

Я заметил, что токен 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 и все заработает. В противном случае вы можете попытаться сделать бэкпорт.

5

Другие решения

Кроме ошибка в 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
7

Я сталкиваюсь с той же проблемой. Я мог бы скомпилировать и запустить, просто закомментировав проблемную строку:

// void (QOPENGLF_APIENTRYP MemoryBarrier)(GLbitfield barriers);

В файле C: /Qt/Qt5.1.1/5.1.1/mingw48_32/include/QtGui/qopenglversionfunctions.h: 785

Мое приложение не использует никаких материалов OpenGL. Будем надеяться, что они скоро это исправят 😉

1

Поскольку принятый ответ, кажется, не помогает, когда кто-то пытается собрать библиотеку 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
1
По вопросам рекламы [email protected]