从Qt文件编译时间错误:')'令牌之前的预期unqualified-id

Pie*_*tro 4 c++ qt mingw qtgui qt5

将我的项目从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);
                                           ^
Run Code Online (Sandbox Code Playgroud)

这是定义链:

#define QOPENGLF_APIENTRYP QOPENGLF_APIENTRY *
#define QOPENGLF_APIENTRY APIENTRY
#define APIENTRY WINAPI
#define WINAPI __stdcall
Run Code Online (Sandbox Code Playgroud)

我注意到libQt5OpenGLExtensionsd.a库中存在"MemoryBarrier"标记.我是否应该包含它,即使在最初的Qt4项目中也没有使用与OpenGL相关的内容?

平台:
Windows 7
MinGW 4.8
Qt 4.8 - > Qt 5.1

Bri*_*Onn 7

除了在io.h中使用uint64_t的MinGW 4.8.1中错误之外,还有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
Run Code Online (Sandbox Code Playgroud)

我刚刚在那里定义了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
Run Code Online (Sandbox Code Playgroud)


lpa*_*app 5

我注意到libQt5OpenGLExtensionsd.a库中存在"MemoryBarrier"标记.我是否应该包含它,即使在最初的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
Run Code Online (Sandbox Code Playgroud)

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,它将工作.如果做不到这一点,你可以尝试向后移植它.