85

在 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

当然,我想/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 (!)

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

4

5 回答 5

128

一种方法MSYS_NO_PATHCONV=1可以通过在 Windows Git MSys 或MSYS2MSYS2_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
于 2015-12-20T22:16:38.123 回答
66

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

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

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

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

于 2013-01-07T03:58:56.257 回答
7

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

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

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

于 2011-08-31T05:07:29.727 回答
5

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

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

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

于 2021-01-04T21:46:34.287 回答
2

不幸的是,为这个例子添加两个正斜杠并没有按预期工作。

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

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

于 2015-12-19T05:12:20.503 回答