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

「MemoryBarrier」トークンが libQt5OpenGLExtensionsd.a ライブラリにあることに気付きました。元の Qt4 プロジェクトで OpenGL に関連するものが何も使用されていなかったとしても、それを含める必要がありますか?

プラットフォーム:
Windows 7
MinGW 4.8
Qt 4.8 --> Qt 5.1

4

4 に答える 4

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 と、MemoryBarrier 定義の undef をチェックする必要があるかもしれません。

編集:これは約半年前に修正されました。詳細については、次の 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は他の解決策は適切な修正ではないと主張しているため、正しく修正する方法を見つけようとしました. MemoryBarrierGoogleで、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 に答える