如何通过修改命令行中给出的路径名来停止MinGW和MSYS


71

在Windows上,我正在使用CodeSourcery的交叉编译器套件为ARM / Linux交叉编译程序。我使用MinGW MSYS作为我的命令解释器,通常它会破坏我的路径和路径名。例如,要构建程序,我调用

当然,我想/usr/lib/myrpath将逐字记录插入myprogram可执行文件中-我要编译的ARM Linux目标不使用MinGW或MSYS。但是,最终结果如下:

不完全是我想要的。如果直接在cmd.exe命令行上调用GCC,则会在可执行文件中获得正确的rpath。如果我在MSYS命令行上调用GCC,则会得到混乱的rpath。如果我使用从cmd.exe命令行使用make运行的Makefile调用GCC,我仍然会得到错误的rpath(!)

有什么想法可以关闭这种令人讨厌的行为吗?

Answers:


48

我刚刚发现了一个巧妙的技巧,可以避免MSYS / MinGW为您转换路径。

如果使用双斜杠启动路径,则MSYS不会将路径转换为DOS格式。因此,在OP的示例中,-rpath开关应指定如下:

-Wl,-rpath=//usr/lib/myrpath

所有的Unix / Linux工具似乎都可以毫无问题地处理此类假斜线,因此,即使您二进制文件的rpath将以// usr / ...开头,我也认为加载程序会做正确的事。


7
它对我不起作用,但-rpath =“ // usr \ lib \ myrpath”可以(对路径使用引号和反斜杠)
Emmanuel Caradec

2
仅当带有a的东西/实际上是路径时,这才起作用。
jpaugh

107

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

另外,您可以通过将赋值放在命令本身之前,仅针对该命令临时设置变量:


15
这是不正确的。它仅在Git for Window的MSYS运行时分支中添加,并且MSYS的上游版本无法识别该MSYS_NO_PATHCONV变量:不是1.0,不是MSYS2,不是32或64位变体。
瓦茨拉夫·斯拉维克

1
太好了 我希望它始终可用。感谢您指出。
xer0x

1
@Phyx:根据给定的URL,环境变量将是MSYS2_ARG_CONV_EXCL与注释中提到的MSYS2_ARG_CONV_EXC。
kbulgrien

2
这对我gpg-connect-agent "/bye"有用,当使用git-bash且命令被误解并导致gpg代理记录:“ C:/ Program Files / Git / bye ERR 67109139 Unknown IPC command <GPG Agent>”
Shannon

4
请注意,这将使bash中的命令混乱,例如npm。在Windows bash中简单地使用npm.cmd,如果你这样做MSYS_NO_PATHCONV=1(如:npm.cmd -i @aspnet/signalr
diegosasw

6

我认为没有办法将其关闭。MSYS是旧Cygwin版本的分支,它具有许多旨在改进Windows集成的调整,因此,当调用本地Windows程序时,自动POSIX路径翻译可能是最重要的。这样做的麻烦在于,并非总是能够分辨出一个参数是路径还是其他东西,或者,在这种情况下,它是否实际上是不应被翻译的路径。翻译是由一系列试探法指导的。

您可以尝试使用MinGW make代替MSYS make(是的,它们是不同的东西),这是Windows的本机内部版本,没有POSIX路径支持和转换。使用安装mingw-get install mingw32-make并以调用mingw32-make

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


谢谢-该链接(启发式方法)帮助我“弄清了”明戈,并让我的生活变得轻松自在。
特德·米德尔顿

4
错误!如果关闭,有一种方法可以切换。stackoverflow.com/a/34386471/404615
Igor Mukhin

4
伊戈尔,也许您想要至少在展示答案之前先看看答案的发布时间。
张敬礼

2

不幸的是,在此示例中使用两个正斜杠无法正常工作。

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

我希望“ rsync”仅排除顶级目录/ application / logs中的文件,因此要使用正斜杠。添加两个正斜杠不会导致它排除此目录。我不得不求助于不太准确的人--exclude="application/logs/"


0

实际上,在MinGW.org提供的原始MSYS项目中,无法禁用Posix路径转换

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

因此,总而言之,要禁用此Posix路径常规:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.