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