Gcc 如何阻止MinGW和MSYS破坏命令行中给出的路径名
在Windows上,我正在使用CodeSourcery的交叉编译器套件为ARM/Linux交叉编译一个程序。我使用mingwmsys作为我的命令解释器,它经常会破坏我的路径和路径名。例如,为了构建我的程序,我调用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../
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
/
的东西实际上是路径时起作用。这是不正确的。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中对我不起作用。