So verhindern Sie, dass MinGW und MSYS die in der Befehlszeile angegebenen Pfadnamen beschädigen

71

Unter Windows kompiliere ich ein Programm für ARM / Linux mithilfe der Cross-Compiler-Suite von CodeSourcery. Ich verwende MinGW MSYS als Befehlsinterpreter, und sehr oft werden meine Pfade und Pfadnamen beschädigt. Um beispielsweise mein Programm zu erstellen, rufe ich auf

Natürlich möchte ich /usr/lib/myrpathwörtlich in die myprogramausführbare Datei einfügen - das ARM Linux-Ziel, für das ich kompiliere, verwendet weder MinGW noch MSYS. Aber hier ist, worauf es ankommt:

Nicht genau das, was ich wollte. Wenn ich GCC direkt über die Befehlszeile cmd.exe aufrufe, erhalte ich den richtigen Pfad in der ausführbaren Datei. Wenn ich GCC über die MSYS-Befehlszeile aufrufe, erhalte ich den verstümmelten Pfad. Wenn ich GCC mit einem Makefile aufrufe, das mit make über die Befehlszeile cmd.exe ausgeführt wird, erhalte ich immer noch einen verstümmelten Pfad (!)

Irgendwelche Ideen, wie ich dieses nervige Verhalten ausschalten könnte?

Ted Middleton
quelle

Antworten:

48

Ich habe gerade einen tollen Trick entdeckt, um zu vermeiden, dass MSYS / MinGW die Pfade für Sie übersetzt.

Wenn Sie den Pfad mit einem doppelten Schrägstrich starten, übersetzt MSYS den Pfad nicht in das DOS-Format. Im Beispiel von OP sollte der Schalter -rpath wie folgt angegeben werden:

-Wl,-rpath=//usr/lib/myrpath

Alle Unix / Linux-Tools scheinen solche unechten Schrägstriche problemlos zu verarbeiten. Auch wenn der Pfad Ihrer Binärdatei mit // usr / ... beginnt, wird der Loader das Richtige tun.

Gurjeet Singh
quelle
7
Es funktioniert nicht für mich, aber -rpath = "// usr \ lib \ myrpath" (mit Anführungszeichen und Backslashes für Pfad)
Emmanuel Caradec
2
Dies funktioniert nur, wenn das Ding mit a /tatsächlich ein Pfad ist.
Jpaugh
107

Es gibt eine Möglichkeit , die MSYS_NO_PATHCONV=1Pfadübersetzung durch Einstellen in Windows Git MSys oder MSYS2_ARG_CONV_EXCL="*"in MSYS2 zu unterdrücken .

Alternativ können Sie die Variable nur vorübergehend nur für diesen Befehl festlegen, indem Sie die Zuweisung direkt vor dem Befehl selbst platzieren:

Igor Mukhin
quelle
15
Das ist falsch. Dies wurde nur in Git for Windows Fork der MSYS-Laufzeit hinzugefügt, und die MSYS_NO_PATHCONVVariable wird von der Upstream-Version von MSYS nicht erkannt: nicht 1.0, nicht MSYS2, keine 32- oder 64-Bit-Varianten.
Václav Slavík
1
Das ist ziemlich toll. Ich wünschte, es wäre immer verfügbar. Vielen Dank für den Hinweis.
xer0x
1
@Phyx: Basierend auf der angegebenen URL wäre die Umgebungsvariable MSYS2_ARG_CONV_EXCL im Vergleich zu MSYS2_ARG_CONV_EXC, die in Ihrem Kommentar erwähnt wird.
kbulgrien
2
Dies funktionierte für mich, wenn git-bash verwendet wurde und der Befehl gpg-connect-agent "/bye"falsch interpretiert wurde und der gpg-Agent protokollierte: "C: / Programme / Git / bye ERR 67109139 Unbekannter IPC-Befehl <GPG-Agent>"
Shannon
4
Beachten Sie, dass dies Befehle in der Bash durcheinander bringt, wie z npm. In Windows verwenden bash einfach , npm.cmdwenn Sie getan haben MSYS_NO_PATHCONV=1(zB: npm.cmd -i @aspnet/signalr)
diegosasw
6

Ich glaube nicht, dass es eine Möglichkeit gibt, dies auszuschalten. MSYS ist eine Abzweigung einer alten Cygwin-Version mit einer Reihe von Verbesserungen, die auf eine verbesserte Windows-Integration abzielen, wobei die automatische POSIX-Pfadübersetzung beim Aufrufen nativer Windows-Programme wohl am wichtigsten ist. Das Problem dabei ist, dass es nicht immer möglich ist zu sagen, ob ein Argument ein Pfad oder etwas anderes ist oder ob es, wie in diesem Fall, tatsächlich ein Pfad ist, der dennoch nicht übersetzt werden sollte. Die Übersetzung wird von einer Reihe von Heuristiken geleitet .

Sie können versuchen, MinGW make anstelle von MSYS make zu verwenden (ja, es handelt sich um verschiedene Dinge). Hierbei handelt es sich um ein natives Windows-Build von make ohne POSIX-Pfadunterstützung und -Konvertierung. Installieren Sie mit mingw-get install mingw32-makeund rufen Sie als auf mingw32-make.

Oder Sie können Cygwin ausprobieren, idealerweise mit einem Cygwin-Build der Toolchain.

ak2
quelle
Danke - dieser Link (die Heuristik) hat mir geholfen, Mingw zu "fälschen" und meinen Weg durch ungestört zu finden.
Ted Middleton
4
FALSCH! Es gibt eine Möglichkeit, AUS auszuschalten. stackoverflow.com/a/34386471/404615
Igor Mukhin
4
Igor, vielleicht möchten Sie zumindest einen Blick auf die Zeit werfen, als die Antwort veröffentlicht wurde, bevor Sie Ihre unendliche Weisheit demonstrieren.
Abel Cheung
2

Leider funktioniert das Setzen von zwei Schrägstrichen für dieses Beispiel nicht wie erwartet.

rsync -rvztn --delete --exclude="/application/logs/" ...

Ich möchte, dass 'rsync' Dateien nur in / application / logs ausschließt, die sich auf der obersten Ebene befinden, daher der führende Schrägstrich. Durch Hinzufügen von zwei Schrägstrichen wird dieses Verzeichnis nicht ausgeschlossen. Ich muss auf die weniger genauen zurückgreifen --exclude="application/logs/".

Steven
quelle
0

Tatsächlich in dem ursprünglichen MSYS Projekt zur Verfügung gestellt MinGW.org , gibt es keine Möglichkeit , das deaktivieren Posix Wegwandlung .

Aus diesem Grund habe ich eine kleine Verzweigung der msys-core- Laufzeit erstellt, die das MSYS_NO_PATHCONVmit der Git for Windows- Verzweigung eingeführte Flag unterstützt . Auf diese Weise können Sie MSYS_NO_PATHCONVUmgebungsvariablen wie im Git für Windows verwenden, jedoch im ursprünglichen MinGW / MSYS .

Um diese Posix-Pfadübereinstimmung zu deaktivieren:

SiZiOUS
quelle