Gcc 如何阻止MinGW和MSYS破坏命令行中给出的路径名

Gcc 如何阻止MinGW和MSYS破坏命令行中给出的路径名,gcc,mingw,cross-compiling,rpath,codesourcery,Gcc,Mingw,Cross Compiling,Rpath,Codesourcery,在Windows上,我正在使用CodeSourcery的交叉编译器套件为ARM/Linux交叉编译一个程序。我使用mingwmsys作为我的命令解释器,它经常会破坏我的路径和路径名。例如,为了构建我的程序,我调用 arm-none-linux-gnueabi-gcc.exe -Wall -g \ -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \ -Wl,-rpath=/usr/lib/myrpath \ -I../

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

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,我将在可执行文件中获得正确的rpath。如果在MSYS命令行上调用GCC,则会得到损坏的rpath。如果我从cmd.exe命令行使用make运行的Makefile调用GCC,我仍然会得到一个损坏的rpath(!)


你知道我该如何关闭这种恼人的行为吗?

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

您可以尝试使用MinGW make代替MSYS make(是的,它们是不同的东西),MSYS make是make的本机Windows构建,不支持POSIX路径和转换。使用
mingw安装获取安装mingw32 make
并作为
mingw32 make
调用


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

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

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

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


所有Unix/Linux工具似乎都可以毫无问题地处理这种虚假的斜杠,因此即使二进制文件的rpath以//usr/…开头。。。我认为加载器会做正确的事情。

不幸的是,为这个例子提出两个前斜杠并没有像预期的那样起作用

rsync-rvztn--delete--exclude=“/application/logs/”。。。


我希望'rsync'仅排除位于顶层的/application/logs处的文件,因此是前导正斜杠。添加两个正斜杠不会导致它排除此目录。我不得不求助于不太准确的
--exclude=“application/logs/”
来抑制路径转换,方法是在Windows Git MSYS中设置
MSYS\u NO\u PATHCONV=1
,或在中设置
MSYS2\u ARG\u CONV\u exc=“*”

或者,您可以将赋值置于命令本身之前,仅为该命令临时设置变量:

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项目中,没有办法禁用

这就是为什么我制作了一个小的运行时分支,它支持
MSYS\u NO\u PATHCONV
标志,该标志是在Git for Windows分支中引入的。通过这种方式,您可以使用
MSYS\u NO\u PATHCONV
环境变量,就像在Git for Windows中一样,但在原始MinGW/MSYS中一样

总之,要禁用此Posix路径转换:

  • 对于(内置):
    MSYS2\u ARG\u CONV\u EXCL=“*”

  • 对于(内置):
    MSYS\u NO\u PATHCONV=1

  • 对于(带):
    MSYS\u NO\u PATHCONV=1

谢谢-这个链接(启发法)帮助我“伪装”了mingw,并让我的道路畅通无阻。错!如果关闭,有一种方法可以关闭。Igor,在展示你的无限智慧之前,也许你至少想看看答案发布的时间。它对我不起作用,但-rpath=“//usr\lib\myrpath”起作用(路径加引号和反斜杠)。这只在带有
/
的东西实际上是路径时起作用。这是不正确的。MSYS的上游版本无法识别此变量和
MSYS\u NO\u PATHCONV
变量:不是1.0,不是MSYS2,不是32位或64位变体。这非常棒。我希望它一直可用。谢谢您指出。@Phyx:根据给出的URL,环境变量将是MSYS2_ARG_CONV_EXC,而不是您在评论中提到的MSYS2_ARG_CONV_EXC。这在使用git bash和命令
gpg connect agent”/bye“
被误解并导致gpg代理记录时对我有效:“C:/Program Files/Git/bye ERR 67109139 Unknown IPC command”请注意,这将打乱bash中的命令,例如
npm
。在Windows bash中,如果您已经执行了
MSYS\u NO\u PATHCONV=1
(例如:
npm.cmd-i@aspnet/signal
MSYS\u NO\u PATHCONV=1
在Git for Windows中对我不起作用。