如何阻止MinGW和MSYS混淆命令行中给出的路径名



在Windows上,我正在使用codesourery的交叉编译器套件为ARM/Linux交叉编译程序。我使用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逐字插入myprogram可执行文件中-我正在编译的ARM Linux目标不使用MinGW或MSYS。下面是最后的内容:

...
0x0000000f (RPATH)            Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...

不是我想要的。如果我直接在cmd.exe命令行上调用GCC,我将在可执行文件中获得正确的路径。如果我在MSYS命令行上调用GCC,就会得到修改过的rpath。如果我用在cmd.exe命令行中使用make运行的Makefile调用GCC,我仍然会得到一个混乱的rpath (!)

有什么办法可以关掉这个烦人的行为吗?

有一种方法可以通过在Windows Git MSys中设置MSYS_NO_PATHCONV=1或在MSYS2中设置MSYS2_ARG_CONV_EXCL="*"来抑制路径转换

或者,您可以通过将赋值放在命令本身之前来临时为该命令设置变量:

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/开始…我认为加载器会做正确的事情。

我不认为有办法关闭它。MSYS是旧Cygwin版本的一个分支,有许多旨在改进Windows集成的调整,其中调用本机Windows程序时的自动POSIX路径转换可以说是最重要的。这样做的问题是,我们并不总是能够分辨出一个参数是一条路径还是别的什么,或者,在这个例子中,它实际上是一条不应该被翻译的路径。翻译是由一组启发式指导的。

你可以尝试使用MinGW make而不是MSYS make(是的,它们是不同的东西),这是make的原生Windows版本,没有POSIX路径支持和转换。使用mingw-get install mingw32-make安装并作为mingw32-make调用。

或者您可以尝试Cygwin,最好使用Cygwin构建的工具链。

事实上,在MinGW.org提供的原始MSYS项目中,没有办法禁用Posix路径转换。

这就是为什么我做了一个msys-core运行时的小分支,它支持MSYS_NO_PATHCONV标志,这是在Git for Windows分支中引入的。这样,您可以使用MSYS_NO_PATHCONV环境变量,就像在Git for Windows中一样,但在原始的MinGW/MSYS中。

总的来说,要禁用Posix路径转换:
  • 对于MSYS2(内置):MSYS2_ARG_CONV_EXCL="*"
  • Git For Windows(内置):MSYS_NO_PATHCONV=1
  • For MinGW.org (with msys-core-extended): MSYS_NO_PATHCONV=1 .

export MSYS_NO_PATHCONV=1对于我在windows上使用git-bash的情况是必要的(如上面的dx_over_dt所述)。

不幸的是,在这个例子中使用两个正斜杠并没有像预期的那样工作。

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

我希望'rsync'只排除位于顶层的/application/logs文件,因此前面有正斜杠。添加两个正斜杠不会导致它排除此目录。我不得不求助于不太准确的--exclude="application/logs/"

相关内容

  • 没有找到相关文章

最新更新