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

时间:2013-09-11 11:16:59

标签: c++ qt mingw qt5 qtgui

将我的项目从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

4 个答案:

答案 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