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 に答える