Jak powstrzymać MinGW i MSY od zniekształcania nazw ścieżek podanych w wierszu poleceń?

W systemie Windows kompiluję program dla ARM / Linuksa za pomocą pakietu cross-compilerów CodeSourcery. Używam mingw msys jako mojego interpretera poleceń i bardzo często będzie on mżał moje ścieżki i nazwy ścieżek. Na przykład, aby zbudować mój program, wywołuję

arm-none-linux-gnueabi-gcc.exe -Wall -g \
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \
    -Wl,-rpath=/usr/lib/myrpath \
    -I../targetsysroot/usr/include \
    myprogram.c -o myprogram

Oczywiście, chcę /usr/lib/myrpath wstawić verbatim do pliku wykonywalnego myprogram - arm linux docelowy, dla którego kompiluję, nie używa mingw ani msys. Ale oto co się w nim kończy:

...
0x0000000f (RPATH)            Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...
Nie dokładnie tego chciałem. If I invoke gcc na cmd.exe wiersz poleceń bezpośrednio, dostaję prawo rpath w pliku wykonywalnym. Jeśli wywołam gcc w linii poleceń msys, dostaję zniekształconą ścieżkę rpath. Jeśli wywołam gcc z Makefile, który jest uruchamiany z make z cmd.exe command line, I still get a mangled rpath (!) Jakieś pomysły, jak Mogę wyłączyć to irytujące zachowanie?
Author: Ted Middleton, 2011-08-31

4 answers

Nie sądzę, żeby można było to wyłączyć. MSYS jest forkiem starej wersji Cygwina z szeregiem poprawek mających na celu ulepszoną integrację systemu Windows, przy czym automatyczne tłumaczenie ścieżki POSIX podczas wywoływania natywnych programów Windows jest prawdopodobnie najbardziej znaczące. Problem z tym polega na tym, że nie zawsze można stwierdzić, czy argument jest ścieżką, czy czymś innym, czy też, jak w tym przypadku, jest to w rzeczywistości ścieżka, której jednak nie należy tłumaczyć. Tłumaczenie jest prowadzone przez zbiór heurystyki .

Możesz spróbować użyć MinGW make zamiast MSYS make (tak, to różne rzeczy), który jest natywną kompilacją make Dla Windows bez obsługi ścieżki POSIX i konwersji. Zainstaluj za pomocą mingw-get install mingw32-make i wywołaj jako mingw32-make.

Lub możesz spróbować Cygwin, najlepiej z Cygwin build of the toolchain.

 6
Author: ak2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 05:36:31

Istnieje sposób aby powstrzymać tłumaczenie ścieżki przez ustawienie MSYS_NO_PATHCONV=1 W Windows Git MSys lub MSYS2_ARG_CONV_EXCL="*" w MSYS2.

Alternatywnie, możesz ustawić zmienną tylko tymczasowo tylko dla tego polecenia, umieszczając przypisanie tuż przed samym poleceniem:

MSYS_NO_PATHCONV=1 arm-none-linux-gnueabi-gcc.exe -Wall -g \
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \
    -Wl,-rpath=/usr/lib/myrpath \
    -I../targetsysroot/usr/include \
    myprogram.c -o myprogram
 46
Author: Igor Mukhin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 05:39:14

Właśnie odkryłem sprytny trik, aby uniknąć MSYS / MinGW tłumacząc ścieżki dla Ciebie.

Jeśli do uruchomienia ścieżki użyjesz podwójnego ukośnika, to MSYS nie przetłumaczy ścieżki do formatu DOS. Tak więc w przykładzie OP, przełącznik-rpath powinien być podany w następujący sposób:

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

Wszystkie narzędzia Unix / Linux zdają się obsługiwać takie fałszywe ukośniki bez żadnego problemu, więc nawet jeśli ścieżka rpath twojego binarnego zacznie się od / / usr/... Myślę, że ładowacz postąpi słusznie.

 18
Author: Gurjeet Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-07 03:58:56

Niestety umieszczenie dwóch ukośników do przodu w tym przykładzie nie działa zgodnie z oczekiwaniami.

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

Chcę, aby 'rsync' wykluczył pliki tylko w /application / logs, który znajduje się na najwyższym poziomie, stąd ukośnik wiodący do przodu. Dodanie dwóch ukośników do przodu nie spowoduje wykluczenia tego katalogu. Muszę uciekać się do mniej dokładnych --exclude="application/logs/".

 0
Author: Steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-19 05:12:20