Как остановить 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/"
.