Много ошибок при компиляции проекта с использованием FMOD с MinGW

Я решил использовать FMOD для воспроизведения звука в моем проекте, но я получаю много ошибок компиляции, которые я не знаю, как их исправить.

Заголовочный файл класса, использующий FMOD, выглядит примерно так:

#ifndef PROJECTNAME_SOUNDMANAGER_H_
#define PROJECTNAME_SOUNDMANAGER_H_

#include <iostream>

#include <fmod.h>
#include <fmod.hpp>
#include <fmod_errors.h>

class SoundManager {
public:
static SoundManager &instance();
void play(char *data, size_t size, bool loop=false);
void stopAll();
private:
void ERRCHECK(FMOD_RESULT result);
SoundManager() : mSystem(nullptr) {
initFMOD();
}
SoundManager(const SoundManager &other);
SoundManager &operator=(const SoundManager &other);
void initFMOD();
FMOD::System *mSystem;
FMOD::Sound *mSound;
FMOD::Channel *mSoundChannel;
};

#endif // PROJECTNAME_SOUNDMANAGER_H_

И вот некоторые из ошибок компиляции:

...../api/inc/fmod.h:1054:33: error: expected ')' before '*' token
...../api/inc/fmod.h:1056:33: error: expected ')' before '*' token
...../api/inc/fmod.h:1058:33: error: expected ')' before '*' token
...../api/inc/fmod.h:1059:33: error: expected ')' before '*' token
.....
...../api/inc/fmod.h:1465:5: error: 'FMOD_SOUND_PCMREADCALLBACK' does not name a type
...../api/inc/fmod.h:1466:5: error: 'FMOD_SOUND_PCMSETPOSCALLBACK' does not name a type
...../api/inc/fmod.h:1467:5: error: 'FMOD_SOUND_NONBLOCKCALLBACK' does not name a type
...../api/inc/fmod.h:1473:5: error: 'FMOD_FILE_OPENCALLBACK' does not name a type
.....
...../api/inc/fmod.h:1828:19: error: expected initializer before 'FMOD_Memory_GetStats'
...../api/inc/fmod.h:1829:19: error: expected initializer before 'FMOD_Debug_SetLevel'
...../api/inc/fmod.h:1830:19: error: expected initializer before 'FMOD_Debug_GetLevel'
...../api/inc/fmod.h:1831:19: error: expected initializer before 'FMOD_File_SetDiskBusy'
.....
...../api/inc/fmod.hpp:59:21: error: expected ';' at end of member declaration
...../api/inc/fmod.hpp:59:51: error: ISO C++ forbids declaration of 'release' with no type [-fpermissive]
...../api/inc/fmod.hpp:62:21: error: expected ';' at end of member declaration
...../api/inc/fmod.hpp:62:21: error: declaration of 'FMOD_RESULT FMOD::System::_stdcall'
...../api/inc/fmod.hpp:59:21: error: conflicts with previous declaration 'FMOD_RESULT FMOD::System::_stdcall'
...../api/inc/fmod.hpp:62:73: error: ISO C++ forbids declaration of 'setOutput' with no type [-fpermissive]
...../api/inc/fmod.hpp:63:21: error: expected ';' at end of member declaration
...../api/inc/fmod.hpp:63:21: error: declaration of 'FMOD_RESULT FMOD::System::_stdcall'
...../api/inc/fmod.hpp:59:21: error: conflicts with previous declaration 'FMOD_RESULT FMOD::System::_stdcall'
.....

Если это имеет какое-то значение, я собираю с -std=c++0x,

Я попытался найти, но не смог найти ничего, что помогло бы мне с этими ошибками.

Обратите внимание, что я использую FMOD Ex 4.44.06.

РЕДАКТИРОВАТЬ: Кажется, я нашел проблему. Когда я делаю минимальный пример и собираю его без -std=c++0xвсе компилируется нормально. Однако, если я добавлю этот флаг, я получу те же ошибки, что и в этом проекте. Нет ли способа заставить FMOD играть хорошо с C ++ 11?

1

Решение

Я предполагаю, что есть что-то определенное как макрос или что-то не определенное как макрос. Теперь ваша задача — привести минимальный пример. Это может означать ручное удаление больших фрагментов кода или копирование кода из заголовочных файлов. Делайте это до тех пор, пока не предоставите код, вызывающий проблемы, в несколько строк. Я думаю, что при этом вы сами найдете проблему.

В небольшом коде, который вы предоставили, я заметил несколько вещей:

  • fmod () на самом деле является функцией, и я мог бы представить несколько компиляторов, предоставляющих это как макрос, который, в свою очередь, конфликтует с #include, но, похоже, это не ваша проблема.
  • Вы включаете как fmod.h, так и fmod.hpp, что выглядит подозрительно.
  • void ERRCHECK(FMOD_RESULT result); выглядит как смесь между функцией и макросом.
  • play() должен, вероятно, взять const char* data,
2

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

Под MSYS2 и GCC v5.4.0 я столкнулся с той же проблемой.
Решение было добавить флаг компиляции -D__CYGWIN32__,

Это связано со следующим в fmod.h:

#if defined(__CYGWIN32__)
#define F_CDECL __cdecl
#define F_STDCALL __stdcall
#define F_DECLSPEC __declspec
#define F_DLLEXPORT ( dllexport )
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64)
#define F_CDECL _cdecl
#define F_STDCALL _stdcall
#define F_DECLSPEC __declspec
#define F_DLLEXPORT ( dllexport )
...
0

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