2011-11-29 105 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'是用于这个特定库的标志。) –