2013-02-11 41 views
1

我決定在我的項目中使用FMOD進行聲音播放,但是我收到了很多編譯器錯誤,我不確定如何解決。使用FMG編譯項目時出現很多錯誤使用MinGW

使用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中表現出色嗎?

+0

什麼*第一個*錯誤? C++錯誤傾向於級聯,並且如果在包含此文件之前出現問題*可能會有許多錯誤作爲第一個錯誤的副作用。一個常見的罪魁禍首是在類定義的末尾丟失分號。 – molbdnilo 2013-02-11 19:59:13

+0

@molbdnilo對不起,我不清楚,打印的第一個錯誤是你在我的帖子中看到的第一個錯誤。 – Merigrim 2013-02-11 20:05:08

+0

我下載了4.44.06,那些行號完全不符合我的fmod.h。例如,1054-1056是一個評論。 – molbdnilo 2013-02-11 20:41:30

回答

2

我的猜測是有一些東西被定義爲宏或未定義爲宏的東西。現在,您的任務是提供一個最簡單的例子。這可能意味着需要手動刪除大量代碼或從頭文件中複製代碼。直到你可以用幾行提供有問題的代碼。我想這樣做,你會發現自己的問題。

有我與你提供的一些代碼注意到幾件事情:)

  • FMOD(實際上是一個功能,我可以想像一些編譯器提供這個宏,它與#反過來衝突包括,但這似乎不是你的問題。
  • 您同時包含fmod.h和fmod.hpp,這看起來很可疑。
  • void ERRCHECK(FMOD_RESULT result);看起來像功能和宏之間的混合。
  • play()應該可能需要一個const char* data
+1

我試着製作一個測試文件,只包含FMOD頭文件和其他東西,但令我驚訝的是它已編譯!然而,當我除了標題包含除去FMOD的所有引用的違規類別時,我仍然得到相同的錯誤。嗯...我會進一步調查。爲了解決你的觀點,fmod.hpp包含了fmod.h,所以這不是問題。即使我刪除了fmod.h include,我仍然得到相同的錯誤。 ERRCHECK只是一個函數,但我承認它可能有一個更好的名稱。 play()應該確實需要一個const char *。謝謝! – Merigrim 2013-02-11 21:04:22

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) 
... 
相關問題