Подтвердить что ты не робот

Как остановить 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 (!)

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

4b9b3361

Ответ 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/".