在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(!)
我有什么想法可以关闭这种恼人的行为吗?
答案 0 :(得分:20)
我刚刚发现了一个巧妙的技巧来避免MSYS / MinGW为你翻译路径。
如果使用双斜杠启动路径,则MSYS不会将路径转换为DOS格式。所以在OP的例子中,应该像这样指定-rpath开关:
-Wl,-rpath=//usr/lib/myrpath
所有Unix / Linux工具似乎都没有任何问题处理这样的虚假斜杠,所以即使你的二进制文件的rpath将以// usr / ...开头,我认为加载器会做正确的事情。
答案 1 :(得分:5)
我认为没有办法将其关闭。 MSYS是旧的Cygwin版本的一个分支,其中包含许多旨在改进Windows集成的调整,其中调用本机Windows程序时自动POSIX路径转换可能是最重要的。这样做的问题在于,并不总是可以判断一个参数是一个路径还是其他东西,或者是否,就像在这种情况下,它实际上是一条不应该被翻译的路径。翻译由set of heuristics。
指导您可以尝试使用MinGW make而不是MSYS make(是的,它们是不同的东西),这是一个没有POSIX路径支持和转换的本机Windows版本的make。使用mingw-get install mingw32-make
安装并调用mingw32-make
。
或者您可以尝试Cygwin,理想情况下使用工具链的Cygwin构建。
答案 2 :(得分:3)
确实,在 MinGW.org 提供的原始 MSYS 项目中,没有办法禁用 Posix path conversion。
这就是为什么我对 msys-core 运行时做了一个小分支,它支持 Git for Windows 分支引入的 MSYS_NO_PATHCONV
标志。这样,您可以像在 Git for Windows 中一样使用 MSYS_NO_PATHCONV
环境变量,但在原始 MinGW/MSYS 中。
总而言之,要禁用此 Posix 路径转换:
MSYS2_ARG_CONV_EXCL="*"
MSYS_NO_PATHCONV=1
MSYS_NO_PATHCONV=1
。答案 3 :(得分:0)
不幸的是,为此示例添加两个正斜杠无法按预期工作。
rsync -rvztn --delete --exclude="/application/logs/" ...
我希望'rsync'仅在位于顶层的/ application / logs中排除文件,因此是前导斜杠。添加两个正斜杠不会导致它排除此目录。我不得不采用不太准确的--exclude="application/logs/"
。