如何在命令行中给出修改路径名的MinGW和MSYS

Ted*_*ton 53 gcc mingw rpath cross-compiling codesourcery

在Windows上,我使用CodeSourcery的交叉编译器套件为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
Run Code Online (Sandbox Code Playgroud)

当然,我想/usr/lib/myrpath逐字插入myprogram可执行文件 - 我正在编译的ARM Linux目标不使用MinGW或MSYS.但是这里最终会涉及到它:

...
0x0000000f (RPATH)            Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...
Run Code Online (Sandbox Code Playgroud)

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

我有什么想法可以关闭这种烦人的行为?

Igo*_*hin 79

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

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

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
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的.这个[仅在Git for Window的MSYS运行时分支中添加](https://github.com/git-for-windows/msys2-runtime/pull/11)和`MSYS_NO_PATHCONV`变量**不被**识别由MSYS的上游版本:不是1.0,不是MSYS2,不是32或64位变体. (11认同)
  • @Phyx:根据给定的URL,环境变量将是MSYS2_ARG_CONV_EXCL,而不是您评论中提到的MSYS2_ARG_CONV_EXC。 (2认同)
  • 当使用 git-bash 并且命令 `gpg-connect-agent "/bye"` 被误解并导致 gpg 代理记录时,这对我有用:“C:/Program Files/Git/bye ERR 67109139 Unknown IPC command <GPG Agent >” (2认同)
  • 注意,这将使bash中的命令混乱,例如`npm`。在Windows bash中,如果已完成`MSYS_NO_PATHCONV = 1`,则只需使用`npm.cmd`(例如:`npm.cmd -i @ aspnet / signalr`)。 (2认同)

Gur*_*ngh 33

我刚刚发现了一个巧妙的技巧来避免MSYS/MinGW为你翻译路径.

如果使用双斜杠启动路径,则MSYS不会将路径转换为DOS格式.所以在OP的例子中,应该像这样指定-rpath开关:

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

所有Unix/Linux工具似乎都没有任何问题处理这样的虚假斜线,所以即使你的二进制文件的rpath将以// usr/...开头,我认为加载器会做正确的事情.

  • 它对我不起作用,但-rpath ="// usr\lib\myrpath"确实(带路引号和反斜杠) (6认同)
  • 仅当带有“/”的东西实际上是路径时才有效。 (3认同)

SiZ*_*OUS 10

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

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

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


ak2*_*ak2 7

我认为没有办法将其关闭.MSYS是旧的Cygwin版本的一个分支,其中包含许多旨在改进Windows集成的调整,其中调用本机Windows程序时自动POSIX路径转换可能是最重要的.这样做的问题在于,并不总是可以判断一个参数是一个路径还是其他东西,或者是否,就像在这种情况下,它实际上是一条不应该被翻译的路径.翻译由一组启发式指导.

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

或者你可以尝试Cygwin,理想情况下使用工具链的Cygwin构建.

  • 错误!如果关闭,有一种方法可以切换.http://stackoverflow.com/a/34386471/404615 (4认同)
  • 谢谢 - 这个链接(启发式)帮助我“假装”mingw 并让我的道路不受干扰。 (2认同)
  • 伊戈尔,也许您想至少在展示答案之前先看看答案的发布时间。 (2认同)

小智 7

在我的情况下,在 Windows 上的 git-bash 上,导出 MSYS_NO_PATHCONV=1 是必要的(如上面 dx_over_dt 所指出的。)