2012-12-07 42 views
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」混淆?

我該如何擺脫?

我很想在這裏使用int而不是枚舉,但另一個Ogre函數需要格式在Ogre :: PixelFormat中。

+0

我想'PixelFormat'被定義爲某處的宏。 – Angew

回答

6

預處理它首先使用gcc -E,然後grep通過文件尋找AVPixelFormatPixelFormat。我懷疑你有一個#define或者漂浮在附近的東西,你只需要找到發生的地方,預編譯的源文件就是這個地方。

+0

啊,是的。來自ffmpeg的pixfmt.h有一個將AVPixelFormat定義爲PixelFormat的宏。另一個證明ffmpeg開發者有點魯莽;) – TheSHEEEP

+0

@TheSHEEEP:我會說一個宏應該死的證明...(順便說一下,你應該接受這個答案)。 –

+0

@djechlin:就我所知,「typedef」不會引發這樣的問題。 –

3

的問題是在avutil/pixfmt.h:

#define PixelFormat AVPixelFormat 

這樣可以防止用戶即使在命名空間中,使用自己的代碼的任何地方單詞「的PixelFormat」。

對於仍然使用舊標識符的舊版軟件,這是對兼容性的破解。

如果您可以編輯代碼,該解決方案非常簡單。只需添加到C++代碼中即可,其中包括ffmpeg標頭之前的一個

#define FF_API_PIX_FMT 0 

這將禁用如果在pixfmt.h頭:

#if FF_API_PIX_FMT 
#define PixelFormat AVPixelFormat 
... 

來源:https://trac.ffmpeg.org/ticket/4216

P.S.我知道這個問題很古老,但不知何故,我覺得沒有解決方案,我需要一個解決方案,所以我添加了它。

+0

嗨,本,編輯在http://stackoverflow.com/review/suggested-edits/13669700部分討論元音討論?如果沒有,讓我們一起創建這個討論並且開始燃燒。然後它應該由3k + rep的人來完成,不會產生太多的編輯。乾杯。 –

+0

嗨,好吧,那是我的想法,因爲它是一個非常不幸地選擇的標籤。子彈物理學更爲合適,許多人爲與彈丸和子彈點有關的事物添加子彈。標籤應該消失,我想我會編輯他們所有的(這也給了我一個美麗的聲譽:))。我很樂意自己做批量改變,但我缺乏聲譽。在刻錄標籤之前,清理那些與子彈物理學無關的東西(主要涉及彈丸和子彈點)對我來說是件好事,這是我爲其中一些人做的另一個編輯。讓我們討論一下。 – Ben