PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : realpath() unter MinGW :-/



SeeksTheMoon
10-08-2005, 16:07
Ich programmiere ein C++ Programm, das unter Windows und Linux übersetzbar sein soll.
Ich muss in dem Programm den Pfad wissen in dem es liegt und komme an diese Information mit realpath().
Eigentlich gehört das zur Standardbibliothek, aber MinGW besitzt diese Funktion nicht.
Kann mir jemand sagen, ob es für crappy Windows weitere Möglichkeiten gibt (ohne gleich configfiles anzulegen o.ä)?

Christian81
11-08-2005, 06:48
realpath() ist kein Standard.
Unter Windows kann man folgendermassen den aktuellen Pfad in dem das Programm liegt mittels GetModuleFileName() herausbekommen. Ist allerdings eine WinAPI - Funktion, kernel32.lib muss mit gelinkt werden.

SeeksTheMoon
11-08-2005, 08:30
#include <limits.h>
#include <stdlib.h>

sieht für mich ziemlich nach Standard-C aus. Windowslibs möchte ich eigentlich nicht linken.
Ich glaube ich mache das mit getcwd. Das ist zwar eine Unix-Funktion , aber interessanterweise meckert MinGW nicht wenn ich die benutze.

Christian81
11-08-2005, 08:44
realpath ist Posix 2001 Standard, du hast recht. Aber MinGW kann Dir kein Posix-Standard liefern da windows dies nicht unterstützt.
getcwd() liefert dir nicht den Pfad in dem deine exe liegt sondern der Pfad aus dem die exe gestartet wurde.

anda_skoa
11-08-2005, 11:51
Du kannst vielleicht über das argv[0] in main() gehen.
Zumindest unter Unix sollte das auch den Pfad enthalten

Ciao,
_

SeeksTheMoon
11-08-2005, 13:27
das geht bei mir leider nicht, da ich das Programm wegen Bibliotheksabhängigkeiten nur in dem Verzeichnis starten kann, in dem es liegt, d.h. argv[0] ist immer "./"+Binaryname

Deshalb habe ich es bisher so gemacht:


int main (int argc, char *argv[]) {
//Pfadnamen+Binarynamen bekommen:
char pfadname[PATH_MAX];
dir = realpath(argv[0],pfadname);

//Binary-Namen mit substr() abschneiden
...

//Pfadnamen ohne Binarynamen verwenden
...
}

Hmm, in dem Fall ist realpath ja mit getcwd identisch - praktisch =)

anda_skoa
11-08-2005, 15:18
Wozu brauchst du den Pfad wenn du ohnehin dort startest?

Ciao,
_

SeeksTheMoon
12-08-2005, 10:41
ich brauche den Pfad für Umgebungsvariablen, die auf einige meiner verwendeten Libs zeigen müssen, sonst kann ich die nicht verwenden.
Ich hab folgende Struktur:
<installpfad>
|-binary
|-libverzeichnis

Ich hole mir also das Verzeichnis der Binary und hänge libverzeichnis dran, dann setze ich das mit setenv und kann loslegen.
Es ist saublöd dass die Libs diese Umgebungsvariablen brauchen, aber leider lässt sich das nicht ändern.
Das was ich mache ist die einzige plattformunabhängige Möglichkeit, die das Korrekte Setzen der Variablen nicht dem User überlässt.
(Ich sehe sie schon angelaufen kommen wenn ich das nicht mache; User sind dumm und böse :D)

anda_skoa
12-08-2005, 12:43
Ist es nicht einfacher du machst ein Startscript?

Wir machen das in der Firma immer so, ein /bin/sh für alle Unixe und ein BATCH Script für Windows.

Ciao,
_