gcc - ¿Cómo evitar que mingw y msys destruyan nombres de rutas dados en la línea de comando?
cross-compiling rpath (4)
En Windows, estoy compilando de forma cruzada un programa para ARM / linux utilizando la suite de compilación cruzada de CodeSourcery. Utilizo mingw msys como mi intérprete de comandos, y muy a menudo se estropearán mis caminos y rutas de acceso. Por ejemplo, para construir mi programa, invoco
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
Por supuesto, quiero que /usr/lib/myrpath
inserte textualmente en el ejecutable de mi programa: el objetivo ARM para Linux que estoy compilando no usa mingw o msys. Pero esto es lo que termina metiéndolo:
...
0x0000000f (RPATH) Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...
No es exactamente lo que quería. Si invoco gcc en la línea de comandos cmd.exe directamente, obtengo la ruta correcta en el ejecutable. Si invoco gcc en la línea de comandos de msys, obtengo la ruta de acceso mutilada. Si invoco gcc con un Makefile que se ejecuta con make desde la línea de comandos de cmd.exe, todavía obtengo un rpath dañado (!)
Alguna idea de cómo podría desactivar este comportamiento molesto?
Acabo de descubrir un buen truco para evitar que MSYS / MinGW traduzca las rutas por ti.
Si utiliza una barra doble para iniciar la ruta, MSYS no traducirá la ruta al formato DOS. Entonces, en el ejemplo de OP, el modificador -path debe especificarse así:
-Wl,-rpath=//usr/lib/myrpath
Todas las herramientas Unix / Linux parecen manejar tales barras espurias sin ningún problema, por lo que aunque el rpath de su binario comience con // usr / ... Creo que el cargador hará lo correcto.
Desafortunadamente, poner dos barras diagonales hacia adelante para este ejemplo no funciona como se esperaba.
rsync -rvztn --delete --exclude="/application/logs/" ...
Quiero que ''rsync'' excluya los archivos solo en / application / logs, que se encuentra en el nivel superior, por lo tanto, la barra diagonal principal. Agregar dos barras diagonales hacia adelante no hará que excluya este directorio. Tengo que recurrir al menos exacto --exclude="application/logs/"
.
Hay una forma de suprimir la traducción de ruta configurando MSYS_NO_PATHCONV=1
en Windows Git MSys o MSYS2_ARG_CONV_EXCL="*"
en MSYS2 .
Alternativamente, puede establecer la variable solo temporalmente para ese comando colocando la asignación justo antes del comando en sí:
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
No creo que haya una manera de apagar esto. MSYS es una bifurcación de una versión antigua de Cygwin con una serie de ajustes dirigidos a mejorar la integración de Windows, por lo que la traducción automática de la ruta POSIX al invocar programas nativos de Windows es posiblemente la más significativa. El problema con esto es que no siempre es posible saber si un argumento es una ruta u otra cosa, o si, como en este caso, es una ruta que, sin embargo, no debería traducirse. La traducción está guiada por un conjunto de heurísticas .
Podría intentar usar MinGW make en lugar de MSYS make (sí, son cosas diferentes), que es una versión nativa de Windows de make sin el soporte ni la conversión de POSIX path. Instale con mingw-get install mingw32-make
e invoque como mingw32-make
.
O puedes probar Cygwin, idealmente con una compilación Cygwin de la cadena de herramientas.