将我的项目从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
我注意到libQt5OpenGLExtensionsd.a库中存在“MemoryBarrier”标记。我是否应该包含它,即使在最初的Qt4项目中也没有使用与OpenGL相关的东西?
平台:
Windows 7
MinGW 4.8
Qt 4.8 - > Qt 5.1
答案 0 :(得分:7)
除了bug in MinGW 4.8.1 with uint64_t in io.h之外,还有QT 5.2.1中的这个。今天我尝试使用MinGW 4.8.1编译QT 5.2.1时遇到了这个问题,所以我想我也会发布我的解决方案。
我不知道QT的官方解决方案是什么,但根据我的需要,我这样做了:
在src / gui / opengl / qopengl.h第49行:
// 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
答案 1 :(得分:5)
我注意到“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维护者Gunnar讨论过这个问题,我计划向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并且它会工作。如果做不到这一点,你可以尝试向后移植它。
答案 2 :(得分:1)
我遇到了同样的问题。我可以编译并运行,只是评论出有问题的一行:
// void (QOPENGLF_APIENTRYP MemoryBarrier)(GLbitfield barriers);
在档案C:/Qt/Qt5.1.1/5.1.1/mingw48_32/include/QtGui/qopenglversionfunctions.h:785
我的应用程序不使用任何OpenGL内容。我们希望他们能尽快解决这个问题; - )
答案 3 :(得分:1)
由于接受的答案似乎没有帮助,当一个人试图建立自己的QT库并且Laszlo Pap声称其他解决方案不是一个正确的解决方案时,我试图找到一种方法正确地修复它。在谷歌上我发现了一个帖子,据说明天没有实现MemoryBarrier
,并且有一个补丁。
所以我尝试将修复程序合并到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