2011-11-29 111 views
0

我從fmod api文檔中獲得以下示例。在Windows上使用gcc編譯FMOD?

/*=============================================================================================== 
PlaySound Example 
Copyright (c), Firelight Technologies Pty, Ltd 2004-2011. 

This example shows how to simply load and play multiple sounds. This is about the simplest 
use of FMOD. 
This makes FMOD decode the into memory when it loads. If the sounds are big and possibly take 
up a lot of ram, then it would be better to use the FMOD_CREATESTREAM flag so that it is 
streamed in realtime as it plays. 
===============================================================================================*/ 
#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 

#include "fmod.h" 
#include "fmod_errors.h" 

void ERRCHECK(FMOD_RESULT result) 
{ 
    if (result != FMOD_OK) 
    { 
     printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result)); 
     exit(-1); 
    } 
} 


int main(int argc, char *argv[]) 
{ 
    FMOD_SYSTEM  *system; 
    FMOD_SOUND  *sound1, *sound2, *sound3; 
    FMOD_CHANNEL  *channel = 0; 
    FMOD_RESULT  result; 
    int    key; 
    unsigned int  version; 

    /* 
     Create a System object and initialize. 
    */ 
    result = FMOD_System_Create(&system); 
    ERRCHECK(result); 

    result = FMOD_System_GetVersion(system, &version); 
    ERRCHECK(result); 

    if (version < FMOD_VERSION) 
    { 
     printf("Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION); 
     return 0; 
    } 

    result = FMOD_System_Init(system, 32, FMOD_INIT_NORMAL, NULL); 
    ERRCHECK(result); 

    result = FMOD_System_CreateSound(system, "../media/drumloop.wav", FMOD_HARDWARE, 0, &sound1); 
    ERRCHECK(result); 

    result = FMOD_Sound_SetMode(sound1, FMOD_LOOP_OFF); /* drumloop.wav has embedded loop points which automatically makes looping turn on, */ 
    ERRCHECK(result);         /* so turn it off here. We could have also just put FMOD_LOOP_OFF in the above CreateSound call. */ 

    result = FMOD_System_CreateSound(system, "../media/jaguar.wav", FMOD_SOFTWARE, 0, &sound2); 
    ERRCHECK(result); 

    result = FMOD_System_CreateSound(system, "../media/swish.wav", FMOD_HARDWARE, 0, &sound3); 
    ERRCHECK(result); 

    printf("===================================================================\n"); 
    printf("PlaySound Example. Copyright (c) Firelight Technologies 2004-2011.\n"); 
    printf("===================================================================\n"); 
    printf("\n"); 
    printf("Press '1' to play a mono sound using hardware mixing\n"); 
    printf("Press '2' to play a mono sound using software mixing\n"); 
    printf("Press '3' to play a stereo sound using hardware mixing\n"); 
    printf("Press 'Esc' to quit\n"); 
    printf("\n"); 

    /* 
     Main loop. 
    */ 
    do 
    { 
     if (_kbhit()) 
     { 
      key = _getch(); 

      switch (key) 
      { 
       case '1' : 
       { 
        result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound1, 0, &channel); 
        ERRCHECK(result); 
        break; 
       } 
       case '2' : 
       { 
        result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound2, 0, &channel); 
        ERRCHECK(result); 
        break; 
       } 
       case '3' : 
       { 
        result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound3, 0, &channel); 
        ERRCHECK(result); 
        break; 
       } 
      } 
     } 

     FMOD_System_Update(system); 

     { 
      unsigned int ms = 0; 
      unsigned int lenms = 0; 
      int   playing = 0; 
      int   paused = 0; 
      int   channelsplaying = 0; 

      if (channel) 
      { 
       FMOD_SOUND *currentsound = 0; 

       result = FMOD_Channel_IsPlaying(channel, &playing); 
       if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) 
       { 
        ERRCHECK(result); 
       } 

       result = FMOD_Channel_GetPaused(channel, &paused); 
       if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) 
       { 
        ERRCHECK(result); 
       } 

       result = FMOD_Channel_GetPosition(channel, &ms, FMOD_TIMEUNIT_MS); 
       if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) 
       { 
        ERRCHECK(result); 
       } 

       FMOD_Channel_GetCurrentSound(channel, &currentsound); 
       if (currentsound) 
       { 
        result = FMOD_Sound_GetLength(currentsound, &lenms, FMOD_TIMEUNIT_MS); 
        if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) 
        { 
         ERRCHECK(result); 
        } 
       } 
      } 

      result = FMOD_Sound_GetLength(sound1, &lenms, FMOD_TIMEUNIT_MS); 
      if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) 
      { 
       ERRCHECK(result); 
      } 

      FMOD_System_GetChannelsPlaying(system, &channelsplaying); 

      printf("Time %02d:%02d:%02d/%02d:%02d:%02d : %s : Channels Playing %2d\r", ms/1000/60, ms/1000 % 60, ms/10 % 100, lenms/1000/60, lenms/1000 % 60, lenms/10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped", channelsplaying); 
     } 

     Sleep(10); 

    } while (key != 27); 

    printf("\n"); 

    /* 
     Shut down 
    */ 
    result = FMOD_Sound_Release(sound1); 
    ERRCHECK(result); 
    result = FMOD_Sound_Release(sound2); 
    ERRCHECK(result); 
    result = FMOD_Sound_Release(sound3); 
    ERRCHECK(result); 
    result = FMOD_System_Close(system); 
    ERRCHECK(result); 
    result = FMOD_System_Release(system); 
    ERRCHECK(result); 

    return 0; 
} 

我試圖編譯它與以下,但它似乎並沒有工作。這是我的輸出...

c:\Users\-r.s-\Desktop\fmod>gcc -c -o test.o test.c -I"C:\Program Files (x86)\FM 
OD SoundSystem\FMOD Programmers API Windows\api\inc" 

c:\Users\-r.s-\Desktop\fmod>gcc -o test.exe test.o -L"C:\Program Files (x86)\FMO 
D SoundSystem\FMOD Programmers API Windows\api\lib" 
test.o:test.c:(.text+0x413): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x436): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x499): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x4d4): undefined reference to `[email protected]' 

test.o:test.c:(.text+0x4f8): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x533): undefined reference to `[email protected]' 

test.o:test.c:(.text+0x56e): undefined reference to `[email protected]' 

test.o:test.c:(.text+0x643): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x67f): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x6bb): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x6d8): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x722): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x757): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x794): undefined reference to `[email protected] 
' 
test.o:test.c:(.text+0x7c9): undefined reference to `FMOD_Channel_GetCurrentSoun 
[email protected]' 
test.o:test.c:(.text+0x7ed): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x82a): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x85f): undefined reference to `FMOD_System_GetChannelsPlay 
[email protected]' 
test.o:test.c:(.text+0x9a8): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x9c4): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x9e0): undefined reference to `[email protected]' 
test.o:test.c:(.text+0x9fc): undefined reference to `[email protected]' 
test.o:test.c:(.text+0xa18): undefined reference to `[email protected]' 
collect2: ld returned 1 exit status 

c:\Users\-r.s-\Desktop\fmod> 

回答

1

看來你缺少從你的連接線的FMOD庫,您需要在-lfmodex到libfmodex.a鏈接到您的項目。

+0

這可能是一個非常愚蠢的問題,但我在哪裏可以找到所有這些鏈接器標誌的列表? ('-lfmodex')。我無法在手冊或任何地方找到它們? – silent

+1

任何GCC手冊都應該提供有關編譯/鏈接標誌的詳細信息。例如:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Link-Options.html#Link-Options –

+0

FMOD文檔*應該*告訴你需要使用哪些鏈接器標誌。 (gcc手冊通常會告訴你關於標誌的信息,但它不會告訴你'-lfmodex'是用於這個特定庫的標誌。) –