Странное перечисление имен enum

Я собираю проект, который использует как ffmpeg, так и Ogre.
Сейчас на винде все отлично работает.

Но когда я хочу скомпилировать файл со следующей строкой кода:

Ogre::PixelFormat format = Ogre::PF_BYTE_RGBA;

Компилятор выдает следующую ошибку:

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

Что странно во многих отношениях, так как я не только указал пространство имен Ogre с помощью ::, но в Ogre также нет AVPixelFormat. Как gcc путает «PixelFormat» с «AVPixelFormat»?

И как я могу избавиться от этого?

Я бы хотел использовать здесь int вместо enum, но другая функция Ogre требует, чтобы формат был в Ogre :: PixelFormat.

4

Решение

Предварительно обработайте это сначала используя gcc -E, затем grep через файл ищет AVPixelFormat или же PixelFormat, Я подозреваю, что у вас есть #define или typedef плавая вокруг, вам просто нужно найти, где это происходит, и предварительно скомпилированный исходный файл — это место, где это станет очевидным.

6

Другие решения

Проблема в avutil / pixfmt.h:

#define PixelFormat AVPixelFormat

Это не позволяет пользователям использовать слово «PixelFormat» где-либо в своем собственном коде, даже в пространствах имен.

Это как взлом совместимости для старого программного обеспечения, все еще использующего старые идентификаторы.

Решение достаточно простое, если вы можете редактировать код. Просто добавьте в C ++ код

#define FF_API_PIX_FMT 0

перед включением заголовков ffmpeg.

Это отключает if в заголовке pixfmt.h:

#if FF_API_PIX_FMT
#define PixelFormat AVPixelFormat
...

Источник: https://trac.ffmpeg.org/ticket/4216

Постскриптум Я знаю, что вопрос старый, но почему-то я чувствую, что решения нет, и мне нужно было решение, поэтому я добавил его.

3

По вопросам рекламы [email protected]