FMOD-Beispielprojekt kompillieren & linken
-
Hi,
derzeit spiele ich bisschen mit FMOD rum und wollte als erstes mal eines der zahlreich beigelegten Beispielprojekte selbst kompillieren (Hab mich für "playstream" entschieden).
Nunja, kompillieren ist mit der C++Datei sowie der C-Datei gleichermaßen kein Problem, allerdigns kann ich die C++Objekt-Datei nicht mit der libfmodex.a linken, mit der C-Version klappt das aber problemlos.
Ich lasse das jeweils von meiner IDE erledigen, aber Pfade etc. sind jeweils die selben, also müsste es ja klappen. Als Fehlermeldung erscheint:
--------------------Configuration: fmodxy - Debug-------------------- Linking... C:\MinGWStudio\test1\fmodxy\Debug\main.o: In function `main': C:\MinGWStudio\test1\fmodxy\main.cpp:43: undefined reference to `_ZN4FMOD6System10getVersionEPj@8' C:\MinGWStudio\test1\fmodxy\main.cpp:52: undefined reference to `_ZN4FMOD6System4initEijPv@16' C:\MinGWStudio\test1\fmodxy\main.cpp:55: undefined reference to `_ZN4FMOD6System12createStreamEPKcjP22FMOD_CREATESOUNDEXINFOPPNS_5SoundE@20' C:\MinGWStudio\test1\fmodxy\main.cpp:69: undefined reference to `_ZN4FMOD6System9playSoundE17FMOD_CHANNELINDEXPNS_5SoundEbPPNS_7ChannelE@20' C:\MinGWStudio\test1\fmodxy\main.cpp:86: undefined reference to `_ZN4FMOD7Channel9getPausedEPb@8' C:\MinGWStudio\test1\fmodxy\main.cpp:87: undefined reference to `_ZN4FMOD7Channel9setPausedEb@8' C:\MinGWStudio\test1\fmodxy\main.cpp:93: undefined reference to `_ZN4FMOD6System6updateEv@4' C:\MinGWStudio\test1\fmodxy\main.cpp:102: undefined reference to `_ZN4FMOD7Channel9isPlayingEPb@8' C:\MinGWStudio\test1\fmodxy\main.cpp:108: undefined reference to `_ZN4FMOD7Channel9getPausedEPb@8' C:\MinGWStudio\test1\fmodxy\main.cpp:114: undefined reference to `_ZN4FMOD7Channel11getPositionEPjj@12' C:\MinGWStudio\test1\fmodxy\main.cpp:120: undefined reference to `_ZN4FMOD5Sound9getLengthEPjj@12' C:\MinGWStudio\test1\fmodxy\main.cpp:138: undefined reference to `_ZN4FMOD5Sound7releaseEv@4' C:\MinGWStudio\test1\fmodxy\main.cpp:140: undefined reference to `_ZN4FMOD6System5closeEv@4' C:\MinGWStudio\test1\fmodxy\main.cpp:142: undefined reference to `_ZN4FMOD6System7releaseEv@4' collect2: ld returned 1 exit status fmodxy.exe - 14 error(s), 0 warning(s)Bin ich zu doof dafür oder warum funkt das nicht?
-
die cpp-datei sieht so aus:
/*=============================================================================================== PlayStream Example Copyright (c), Firelight Technologies Pty, Ltd 2004-2005. This example shows how to simply play a stream, such as an mp3 or wav. The stream behaviour is achieved by specifying FMOD_CREATESTREAM in the call to System::createSound. This makes FMOD decode the file in realtime as it plays, instead of loading it all at once. This uses far less memory, in exchange for a small runtime cpu hit. ===============================================================================================*/ #include "../../api/inc/fmod.hpp" #include "../../api/inc/fmod_errors.h" #include <windows.h> #include <stdio.h> #include <conio.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 *sound; 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 = system->getVersion(&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 = system->init(1, FMOD_INIT_NORMAL, 0); ERRCHECK(result); result = system->createStream("../media/wave.mp3", FMOD_HARDWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound); ERRCHECK(result); printf("====================================================================\n"); printf("PlayStream Example. Copyright (c) Firelight Technologies 2004-2005.\n"); printf("====================================================================\n"); printf("\n"); printf("Press space to pause, Esc to quit\n"); printf("\n"); /* Play the sound. */ result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel); ERRCHECK(result); /* Main loop. */ do { if (kbhit()) { key = getch(); switch (key) { case ' ' : { bool paused; channel->getPaused(&paused); channel->setPaused(!paused); break; } } } system->update(); if (channel) { unsigned int ms; unsigned int lenms; bool playing; bool paused; channel->isPlaying(&playing); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) { ERRCHECK(result); } result = channel->getPaused(&paused); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) { ERRCHECK(result); } result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) { ERRCHECK(result); } result = sound->getLength(&lenms, FMOD_TIMEUNIT_MS); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) { ERRCHECK(result); } printf("Time %02d:%02d:%02d/%02d:%02d:%02d : %s\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped"); } Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ result = sound->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }
-
ich hab's grad überprüft, es klappt wirkich nicht!
muss wohl an der fmod-lib liegen.
-
you can't use the C++ interface under anything but MSVC because C++ symbols are not def'able and are not compatible.
-
C Interface nutzen und selber in Klassen wrappen!
-
kenner der Lösung schrieb:
C Interface nutzen und selber in Klassen wrappen!
boah, das ist aber masochistisch!
-
kenner des kenner der lös schrieb:
kenner der Lösung schrieb:
C Interface nutzen und selber in Klassen wrappen!
boah, das ist aber masochistisch!
Nein, vernünftig
-
dfgggggggggggggg schrieb:
kenner des kenner der lös schrieb:
kenner der Lösung schrieb:
C Interface nutzen und selber in Klassen wrappen!
boah, das ist aber masochistisch!
Nein, vernünftig
ok, hast mich überzeugt. aber nur wrappen, was auch nötig ist, ok?
-
maso schrieb:
dfgggggggggggggg schrieb:
kenner des kenner der lös schrieb:
kenner der Lösung schrieb:
C Interface nutzen und selber in Klassen wrappen!
boah, das ist aber masochistisch!
Nein, vernünftig
ok, hast mich überzeugt. aber nur wrappen, was auch nötig ist, ok?
Wenn schon wrappen, dann richtig.
=> Mit eigener Funktionalität erweitern, sprich an siene Bedrüfnisse anpassen und nicht nur ganz trocken die C Funktionen in C++ klassen packen.