Lib's und DLL's



  • Hallo!

    Tja ich hoffe, dass ich hier nun in das richtige Forum poste 🙂
    Ich bin gerade am überarbeiten eines meiner Projekte und möchte folgendes erreichen:

    Ausgangssituation:
    Eine Dll, welche diverse Libs, wie fmodvc.lib, libpng.lib,... verwendet. Nun möchte ich wissen, ob es möglich ist, die Libs direkt in die Dll zu inkludieren.

    Bis jetzt hab ich immer dieses Problem. Wenn ich eine Anwenung basierend auf meiner Dll an einem anderen Rechner mache, z.B.: Schule, benötige ich die ganzen libs um die Anwendung ohne Fehler zu compilen.

    So weit ich das beutreilen kann, geht das mittels Fmod auch so ähnlich. Da ja Fmod bekanntlich unter anderem DirectX für die Audioausgabe verwendet, doch man braucht KEINE DirectX SDK um mit der Fmod Dll/lib zu arbeiten.

    Wie man ich das nun? Am besten wäre es, wenn es eine einheitliche Methode geben würde, da ich bei mir mit VC++ 6.0 arbeite und in der Schule mit Dev-C++.

    Danke, Austrian Coder



  • libs bindet man wie folgt an ein project:

    #pragma comment( lib,"myLib.lib")
    

    hoffe, ich habe deine frage richtig verstanden 🙄

    rocknix ///



  • So weit ich das beutreilen kann, geht das mittels Fmod auch so ähnlich. Da ja Fmod bekanntlich unter anderem DirectX für die Audioausgabe verwendet, doch man braucht KEINE DirectX SDK um mit der Fmod Dll/lib zu arbeiten.

    Du brauchst kein DirectX SDK dazu, weil du fmod ja nicht kompilierst. 🙂

    Wenn du deine DLL nicht immer neu kompilierst, sondern nur in irgendein Projekt einbindest, sollte das auch ohne die anderen libs gehen.



  • Tja eben da liegt das Problem. Ich hab mal schnell eine SoundDll gemacht, welche auf Fmod bassiert, also ein kleiner Warpper.

    So sieht mein Testprgramm aus:

    #pragma comment(lib, "SoundDll.lib")
    
    #include "n_soundsystem.h"
    
    int main()
    {
        return 0;
    }
    

    und die Fehler bekomm ich:
    Linker-Vorgang läuft...
    Bibliothek Release/Testprogramm.lib und Objekt Release/Testprogramm.exp wird erstellt
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_GetCPUUsage@0
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_GetError@0
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_Update@0
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_GetNumTracks@4
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_GetTrack@4
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_GetTrackLength@8
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_GetVolume@4
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_SetPaused@8
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_SetVolume@8
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_Play@8
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_Stop@4
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _FSOUND_CD_Eject@4

    Tja.. hier ein Ausschnitt aus der Dll:
    soundsystem.h

    #pragma comment(lib, "fmodvc.lib")
    
    #include "fmod.h"
    #include "fmod_errors.h"    // optional 
    ...
    

    Tja... wenn ihr wollt, kann ich mal den Source hochladen...

    Danke, Christian



  • das #pragma comment(lib, "fmodvc.lib") muss ins Testprogramm, also in den Quellcode der EXE und nicht der DLL



  • Dann braucht der/die Entwickler, die mit meiner Dll arbeiten die ganzen verwendeten Libs auch. Und genau das will ich nicht! Die Libs sollen alle irgendwie in die Dll hingebracht werden.

    Du brauchst kein DirectX SDK dazu, weil du fmod ja nicht kompilierst.

    Genau... wenn ich jetzt aber z.B.: DirectX für Input verwenden will, dann muss ich ja #pragma comment(lib, "dinput.lib") ins Testprogramm/fertige Anwendung und schon muss ich meiner Dll alle libs mitliefern.

    Also so kann es doch nicht gehen, oder?



  • Dann braucht der/die Entwickler, die mit meiner Dll arbeiten die ganzen verwendeten Libs auch. Und genau das will ich nicht!

    Läßt sich aber nicht verhindern. :p
    Außer du hast den Code der fmod dll.



  • Dann schließe ich daraus, dass das Fmod-Team den Source der DirectX Soundroutinen hat.

    Irgendwas stimmt da doch nicht...



  • tschuldigung, dann hab ich wohl unrecht. 🙂



  • Wer weiß, vielleicht habe ich auch unrecht und will einfach mein Problem lösen.



  • Die einzige Möglichkeit, die ich sehe ist, die DLLs als Resource einzubinden.



  • Von Anfang an:
    Du hast eine DLL geschrieben welche Funktionen aus anderen DLL`s braucht.

    Dann musst du die Libs der DLL mit linken.

    Nun wird die Lib in einem Programm gebraucht.
    Da brauchst du die anderen lib nicht mehr. Lediglich dann zur Ausführung werden die DLL`s benötigt.
    Ein pragma comment(
    ist der falsche weg außer man definiert noch einige defines da man ja im Normalfall die gleiche header für den Import und Export verwenden will.

    Wenn das bei dir nicht funktioniert dann machst du etwas anderes falsch.
    Wers nicht glaubt:
    Siehe meine HP.
    Dort gibt es auch eine DLL welche jedoch wieder die MYSQL-DLL einbindet. und da brauchst du die Lib auch nicht.



  • ich denk mal, das problem was er hat, ist nen klein wenig anders 😃
    Er hat die DLL, die Lib's sind dazu gelinkt, in seinem Programm aber included er die header von den LIB's und ruft die funktionen in den Libs auf ???
    Das funktioniert, glaub ich, auch nach nem LoadLibary nicht 🙂

    Also, du musst, wenn du die FUnktionen in den statischen Libs ueber ne DLL einbinden willst, die Funktionen durch die DLL "durchschleifen" ....
    Sprich, deine Lib hat ne Funktion int "PlaySound()", dann schreib fuer deine DLL eine Funktion "int PlaySoundA(){return PlaySound();};" und verwende die Funktion PlaySoundA() in deinem executiable

    Ciao ...



  • Ich lade heute noch mal meine Testdll inc. Testprgamm,.. hoch...



  • Hier: http://www.visual-page.de/SoundDll.zip

    Also ich hab da mal schnell was zusammengebastelt...

    Christian


Anmelden zum Antworten