Как остановить MinGW и MSYS от искажения имен путей, указанных в командной строке - PullRequest
45 голосов
/ 31 августа 2011

В Windows я кросс-компилирую программу для ARM / Linux, используя набор кросс-компиляторов CodeSourcery. Я использую MinGW MSYS в качестве моего интерпретатора команд, и очень часто он искажает мои пути и имена путей. Например, для сборки моей программы я вызываю

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

Конечно, я хочу, чтобы /usr/lib/myrpath дословно вставил в исполняемый файл myprogram - цель ARM Linux, для которой я собираю компилятор, не использует MinGW или MSYS. Но вот что в итоге приводит к этому:

...
0x0000000f (RPATH)            Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...

Не совсем то, что я хотел. Если я вызываю GCC в командной строке cmd.exe напрямую, я получаю правильный rpath в исполняемом файле. Если я вызываю GCC в командной строке MSYS, я получаю искаженный rpath. Если я вызываю GCC с Makefile, который запускается с make из командной строки cmd.exe, я все равно получаю искаженный rpath (!)

Есть идеи, как мне отключить это раздражающее поведение?

Ответы [ 4 ]

68 голосов
/ 21 декабря 2015

Там - это способ для подавления перевода пути, установив MSYS_NO_PATHCONV=1 в Windows Git MSys или MSYS2_ARG_CONV_EXCL="*" в MSYS2 .

В качестве альтернативы, вы можетеустановите переменную только временно только для этой команды, поместив присваивание непосредственно перед самой командой:

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
22 голосов
/ 07 января 2013

Я только что обнаружил ловкий трюк, чтобы MSYS / MinGW не переводили пути для вас.

Если вы используете двойную косую черту для начала пути, MSYS не будет переводить путь в формат DOS. Таким образом, в примере OP ключ -rpath должен быть указан следующим образом:

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

Кажется, что все инструменты Unix / Linux справляются с такими ложными слешами без каких-либо проблем, поэтому, хотя rpath вашего двоичного файла будет начинаться с // usr / ... Я думаю, что загрузчик будет делать правильные вещи.

5 голосов
/ 31 августа 2011

Не думаю, что есть способ отключить это. MSYS - это ветвь старой версии Cygwin с множеством настроек, направленных на улучшенную интеграцию с Windows, поэтому автоматическая трансляция путей POSIX при вызове собственных программ Windows, пожалуй, наиболее важна. Проблема в том, что не всегда возможно определить, является ли аргумент путем или чем-то еще, или же, как в данном случае, это на самом деле путь, который, тем не менее, не следует переводить. Перевод руководствуется набором эвристик .

Вы можете попробовать использовать make MinGW вместо make MSYS (да, это разные вещи), которая является встроенной сборкой make для Windows без поддержки и преобразования пути POSIX. Установить с mingw-get install mingw32-make и вызвать как mingw32-make.

Или вы можете попробовать Cygwin, в идеале с Cygwin-сборкой набора инструментов.

0 голосов
/ 19 декабря 2015

К сожалению, установка двух косых черт для этого примера не работает должным образом.

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

Я хочу, чтобы rsync исключал файлы только в / application / logs, которыйверхний уровень, следовательно, ведущий слеш.Добавление двух косых черт не приведет к исключению этого каталога.Я должен прибегнуть к менее точным --exclude="application/logs/".

...