2011-11-29 1 views
0

다음 예제는 fmod api docs에서 가져 왔습니다.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 라이브러리를 누락 것 같다 ... 내 출력, 당신은 당신의 프로젝트에 libfmodex.a에 연결 -lfmodex이 필요합니다.

+0

정말 멍청한 질문 일지 모르지만이 모든 링커 플래그 목록은 어디에서 찾을 수 있습니까? ('-lfmodex'). 매뉴얼이나 어디서나 찾을 수 없습니까? – silent

+1

GCC 매뉴얼은 컴파일/링크 플래그에 대한 자세한 정보를 제공해야합니다. 예 : http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Link-Options.html#LinkOptions –

+0

FMOD 문서 *는 사용해야하는 링커 플래그를 알려줍니다. (gcc 매뉴얼은 일반적으로 플래그에 대해 알려줄 것이지만'-lfmodex'가이 특정 라이브러리에 사용할 플래그라고 말하지 않을 것이다.) –