4

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

4 回答 4

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

我只是在那里未定义 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
于 2014-02-19T05:46:48.757 回答
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

Qt 可能需要检查 ifdef MINGW/GCC/VERSION 并取消定义 MemoryBarrier 的定义。

编辑:这是大约半年前修复的。有关详细信息,请参阅以下 Gerrit 评论和相应的错误报告:

https://codereview.qt-project.org/#change,68156

https://bugreports.qt.io/browse/QTBUG-34080

所以,更新到 Qt 5.2.0 就可以了。如果做不到这一点,您可以尝试向后移植它。

于 2013-09-12T07:22:46.957 回答
1

我遇到了同样的问题。我可以通过注释掉有问题的行来编译和运行:

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

在文件 C:/Qt/Qt5.1.1/5.1.1/mingw48_32/include/QtGui/qopenglversionfunctions.h:785

我的应用程序不使用任何 OpenGL 的东西。让我们希望他们尽快修复它;-)

于 2013-12-12T03:48:35.120 回答
1

由于当人们尝试自己构建 QT 库时,接受的答案似乎没有帮助,并且 Laszlo Pap 声称其他解决方案不是正确的修复,我试图找到一种正确修复它的方法。在谷歌上,我发现了一个帖子,据说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
于 2014-03-27T08:19:22.790 回答