Entwickler-Ecke

Dateizugriff - DLLs statisch laden mit Ortsangabe


Martok - Do 13.12.12 22:21
Titel: DLLs statisch laden mit Ortsangabe
Hi!

Wie ihr (natürlich 8) ) wisst, ist MassiveUniverseOnline durch FreePascal mindestens auf Win32, Win64 und eventuell diversen *nixen verfügbar.

Da wir nun aber eine größere Anzahl externe Bibliotheken verwenden, wird das langsam echt unübersichtlich, diese immer in den passenden Ausführungen mitzuführen. Zum deployen geht das ja noch - da packt man halt einfach die richtigen ein. Aber zum Debuggen ist das einiger Aufwand, da wir auch da schon gemischt arbeiten.

Momentan habe ich das in den Headern so gelöst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  {$IFDEF Win32}
    sndfilelib='libsndfile-1_x86.dll';
  {$ENDIF}
  {$IFDEF Win64}
    sndfilelib='libsndfile-1_x64.dll';
  {$ENDIF}
  //...


Nun ist das aber Overhead und auch nicht so wirklich toll, weil eben alle DLLs im Binary-Ordner durcheinanderfliegen. Was ich schön finden würde, wäre diese Struktur:

Nicht wirklich sinnvolle Lib-Auswahl...
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
MUO-Root
├───lib
│   ├───i386
│   │       libogg-0.dll
│   │       libsndfile-1.dll
│   │       libvorbis-0.dll
│   │       libvorbisfile-3.dll
│   │
│   └───x86_64
│           libogg-0.dll
│           libsndfile-1.dll
│           libvorbis-0.dll
│           libvorbisfile-3.dll

├───Application.exe

Und dann würde ich einfach dem Windows-DLL-Loader sagen, er möchte die Dateien bitte aus dem passenden Pfad laden. Dieser Pfad kann ja durchaus fest eincompiliert sein. Wenn man alle DLLs dynamisch linken und selber laden würde wäre das ja kein Problem, ist aber einiger Header-Konvertierungs-Aufwand.
Im Grunde suche ich sowas wie ein reincompilierbares LD_PATH=foo ;-)

Existiert sowas?


Viele Grüße,
Martok


GuaAck - Fr 14.12.12 20:21

Hallo Martok,

es scheint ja wenige Ideen zu geben. Vielleicht ein Ansatz:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  {$IFDEF Win32}
    directory='MUA-Root\lib_x86\';
  {$ENDIF}
  {$IFDEF Win64}
    directory='MUA-Root\lib_x64\';
  {$ENDIF}
  //...
sndfilelib=directory+'libsndfile.dll';
  //...


Gruß GuaAck


jaenicke - Fr 14.12.12 21:43

Es gibt wenige Ideen, weil es das (schon aus Sicherheitsgründen) nicht gibt. ;-)

Normalerweise ist genau dafür ein Setup da, insbesondere bei Spielen. Da werden die DLLs an den passenden Orten dann einfach registriert und damit hat sich das ganze, dann weiß Windows wo es die DLLs findet.
Das geht unter:

Quelltext
1:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths                    


Martok - Fr 14.12.12 23:25

Hm.
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Normalerweise ist genau dafür ein Setup da, insbesondere bei Spielen.

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
zum deployen geht das ja noch - da packt man halt einfach die richtigen ein. Aber zum Debuggen ist das einiger Aufwand, da wir auch da schon gemischt arbeiten.

Geht ja grade um den nicht-deployeten Teil.
Und leider auch nicht nur eine Binary, sonst könnte man die ja einfach per Projektoptionen in ein passendes Verzeichnis werfen - in die Richtung geht das direkt in Lazarus. Betrifft aber eben auch eine Hand voll Testprogramme/Featuredemos, die wieder alle ins Hauptprojektverzeichnis werfen ist auch nix.

Nagut. Bleibt also wohl nichts anderes als eine zentrale Sammelstelle im Repo und dann Copypasta der jeweils gebrauchten DLLs ins Ausgabeverzeichnis.


jaenicke - Sa 15.12.12 00:03

Zum Debuggen kannst du doch auch an der Stelle die Einträge in die Registry setzen bzw. wieder löschen. Ich weiß nicht, ob sich das direkt auswirkt, aber ich vermute es.