Как остановить mingw и msys от искажения имен путей, заданных в командной строке?

В 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

конечно, я хочу!--2--> вставить дословно в 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 ответов


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

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

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


здесь путь чтобы подавить перевод пути, установив 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

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

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

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

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


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

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

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