1

我决定在我的项目中使用 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 配合得很好?

4

2 回答 2

2

我的猜测是有些东西被定义为宏或未定义为宏的东西。现在,您的任务是提供一个最小示例。这可能意味着手动删除大段代码或从头文件中复制代码。这样做,直到您可以在几行中提供有问题的代码。我想这样做,您会自己发现问题。

通过您提供的小代码,我注意到了一些事情:

  • fmod() 实际上是一个函数,我可以想象一些编译器将它作为一个宏提供,这反过来又与#include 冲突,但这似乎不是你的问题。
  • 您同时包含 fmod.h 和 fmod.hpp,这看起来很可疑。
  • void ERRCHECK(FMOD_RESULT result);看起来像是函数和宏的混合体。
  • play()应该可能需要一个const char* data.
于 2013-02-11T20:55:51.373 回答
0

在 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 )
...
于 2016-07-15T16:19:36.987 回答