Können *.DLL Dateien auch in einem Unterverzeichnis eines Programmes liefen?



  • Wenn man einen Ordner mit z.B. folgender Struktur hat:

    f:\test\multithreading.c
    f:\test\include\semaphore.h
    f:\test\include\sched.h
    f:\test\include\pthread.h
    f:\test\libs\pthreadGC2.dll

    Und den Header in der Quellcodedatei folgendermaßen einbindet:
    #include "include/pthread.h"

    Dann läßt sich das Programm mit folgendem Befehl fehlerfrei compilieren
    und linken:

    f:\test>gcc -o multithread.exe multithreading.c -std=c90 -Iinclude -Llibs -lpthreadGC2

    Beim Ausführen des fertig compilierten Programms sucht es allerdings die *.dll Datei im gleichen Verzeichnis, in dem auch die ausführbare EXE Datei liegt und wenn sie sich die DLL Datei dort nicht befindet,
    wie es hier in diesem Beispiel der Fall ist und wenn sie sich auch nicht im Windows Systemverzeichnis befindet, dann schlägt die Ausführung der Datei fehl.

    Frage:

    Wie kann man ein Programm ausführen und die für das Programm notwendige DLL Dateien dennoch in einem Unterverzeichnis behalten?

    Ist das unter Windows irgendwie möglich?
    Und falls ja, welche Möglichkeiten gibt es dafür?

    Ich finde es nämlich leider etwas unschön, wenn die dem Programm mitgeführten *.DLL Dateien im gleichen Verzeichnis liegen müssen, die die ausführbaren Executables.



  • Hallo,

    beim Linken ist wichtig, daß sich in den angegebenen Lib-Ordnern (-L) Dateien mit der Endung ".lib" befinden (d.h. es ist irrelevant, wo und ob sich überhaupt dann eine ".dll"-Datei dadrin befindet).
    Erst beim Ausführen des Programmes werden die DLLs gesucht und dies geschieht (unter Windows) anhand der "PATH"-Umgebungsvariablen.

    Wenn du also DLLs in Unterordnern halten möchtest, dann mußt du entweder die globale PATH-Variable ändern, oder aber dir eine Batch-Datei schreiben, welche temporär den PATH erweitert:

    set PATH=%PATH%;Libs
    
    multithread.exe
    

    Und der Anwender muß nun die Batch-Datei starten (anstatt direkt das Programm).



  • Mehr Inormationen zur genauen Suchreihenfolge gibt es übrigens hier:
    http://msdn.microsoft.com/en-us/library/7d83bc18(VS.80).aspx

    MfG SideWinder



  • wenn ich mich nicht irre, würde das Setzen von PATH in der bat-Datei dann auch den PATH von allen weiteren Prozessen beinflussen, die von der exe gestartet werden.

    Das sollte man besser nicht machen ⚠



  • Dann halt noch einfacher:

    Meinspiel/bin/Meinspiel.exe
    Meinspiel/bin/Vielelibs.dll
    Meinspiel/run.bat
    

    Und in diese run.bat:

    cd bin
    Meinspiel.exe
    


  • Das cd bin ist nichtmal nötig.
    Windows sucht ja zuerst direkt neben der .exe, erst dann im aktuellen Verzeichnis.



  • Doch, ist schon notwendig. Da geht es ja nicht um die DLL-Auflösung...

    MfG SideWinder



  • SideWinder schrieb:

    Doch, ist schon notwendig. Da geht es ja nicht um die DLL-Auflösung...

    MfG SideWinder

    Warum funktioniert

    bin\Meinspiel.exe
    

    nicht?



  • Genaugenommen ist es nicht nur nicht notwendig, sondern auch nicht ausreichend. Was wenn jmd. run.bat mit einem "unpassenden" Working-Directory startet?
    Also entweder

    cd /D "%~dp0bin"
    Meinspiel.exe
    

    oder einfach

    "%~dp0bin\Meinspiel.exe"
    


  • Helium schrieb:

    SideWinder schrieb:

    Doch, ist schon notwendig. Da geht es ja nicht um die DLL-Auflösung...

    MfG SideWinder

    Warum funktioniert

    bin\Meinspiel.exe
    

    nicht?

    Guckst du ganz oben!


Anmelden zum Antworten