Как остановить 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
Конечно, я хочу, чтобы /usr/lib/myrpath
вставил verbatim в исполняемый файл 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 (!)
Любые идеи, как я могу отключить это раздражающее поведение?
Ответы
Ответ 1
Я не думаю, что есть способ отключить это. MSYS - это вилка старой версии Cygwin с множеством настроек, направленных на улучшенную интеграцию с Windows, благодаря чему автоматический перевод POSIX-маршрута при вызове собственных программ Windows, возможно, является самым значительным. Проблема в том, что не всегда можно определить, является ли аргумент пути или что-то еще, или же, как в этом случае, это фактически путь, который, тем не менее, не должен быть переведен. Перевод осуществляется с помощью эвристики.
Вы можете попробовать использовать MinGW make вместо MSYS (да, это разные вещи), которая является собственной сборкой Windows без make-поддержки и преобразования пути POSIX. Установите с помощью mingw-get install mingw32-make
и вызовите mingw32-make
.
Или вы могли бы попробовать Cygwin, в идеале, с помощью сборки Cygwin инструментальной цепочки.
Ответ 2
Там является способом, чтобы подавить перевод пути, установив 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
Ответ 3
Я только что нашел аккуратный трюк, чтобы избежать MSYS/MinGW, переводя пути для вас.
Если вы используете двойной слэш для запуска пути, то MSYS не будет переводить путь к DOS-формату. Поэтому в OP-примере переключатель -rpath должен быть указан следующим образом:
-Wl,-rpath=//usr/lib/myrpath
Все инструменты Unix/Linux, похоже, справляются с такой ложной косой чертой без каких-либо проблем, поэтому даже если ваш двоичный путь rpath начнется с //usr/... Я думаю, что загрузчик пойдет правильно.
Ответ 4
К сожалению, для этого примера два слэша для слэша не работают должным образом.
rsync -rvztn --delete --exclude="/application/logs/" ...
Я хочу, чтобы "rsync" исключил файлы только в /application/logs, который находится на верхнем уровне, следовательно, является ведущей косой чертой. Добавление двух косых черт не приведет к исключению этого каталога. Я должен прибегнуть к менее точным --exclude="application/logs/"
.