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.


Anmelden zum Antworten