4

ffmpeg と Ogre の両方を使用するプロジェクトをコンパイルしています。Windowsでは、すべて正常に動作します。

しかし、次のコード行でファイルをコンパイルしたい場合:

Ogre::PixelFormat format = Ogre::PF_BYTE_RGBA;

コンパイラは次のエラーを返します。

error: ‘AVPixelFormat’ is not a member of ‘Ogre’

Ogre 名前空間を :: で指定しただけでなく、Ogre には AVPixelFormat がないため、これは多くの点で奇妙です。gcc は「PixelFormat」と「AVPixelFormat」をどのように混同しますか?

どうすればそれを取り除くことができますか?

ここで enum の代わりに int を使用したいのですが、別の Ogre 関数では format が Ogre::PixelFormat にある必要があります。

4

2 に答える 2

6

最初に を使用して前処理しgcc -E、次にファイルを介してまたはgrepを探します。#define または浮動小数点があると思われます。これが発生する場所を見つける必要があるだけです。プリコンパイル済みのソース ファイルは、これが明らかになる場所です。AVPixelFormatPixelFormattypedef

于 2012-12-07T15:57:26.133 に答える
3

問題は avutil/pixfmt.h にあります:

#define PixelFormat AVPixelFormat

これにより、名前空間であっても、ユーザーは自分のコードのどこでも「PixelFormat」という単語を使用できなくなります。

これは、古い識別子をまだ使用している古いソフトウェアの互換性ハックとして存在します。

コードを編集できる場合、解決策は非常に簡単です。C++ コードに追加するだけです。

#define FF_API_PIX_FMT 0

ffmpeg ヘッダーを含める前に。

これにより、pixfmt.h ヘッダーの if が無効になります。

#if FF_API_PIX_FMT
#define PixelFormat AVPixelFormat
...

ソース: https://trac.ffmpeg.org/ticket/4216

PS質問が古いことは知っていますが、どういうわけか解決策がなく、解決策が必要だと感じたので追加しました。

于 2015-04-29T15:31:03.087 に答える