Я решил использовать 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?
Я предполагаю, что есть что-то определенное как макрос или что-то не определенное как макрос. Теперь ваша задача — привести минимальный пример. Это может означать ручное удаление больших фрагментов кода или копирование кода из заголовочных файлов. Делайте это до тех пор, пока не предоставите код, вызывающий проблемы, в несколько строк. Я думаю, что при этом вы сами найдете проблему.
В небольшом коде, который вы предоставили, я заметил несколько вещей:
void ERRCHECK(FMOD_RESULT result);
выглядит как смесь между функцией и макросом.play()
должен, вероятно, взять const char* data
,Под 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 )
...