2011-08-30 56 views
24

在Windows上,我使用CodeSourcery的交叉编译器套件交叉编译ARM/linux程序。我使用mingw msys作为我的命令解释器,并且经常会破坏我的路径和路径名。例如,为了建立我的计划,我调用如何阻止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(!)

任何想法如何关闭这种恼人的行为?

回答

5

我不认为有一种方法可以关闭它。 MSYS是旧版Cygwin版本的一个分支,其中一些调整旨在改进Windows集成,在调用本地Windows程序时自动进行POSIX路径转换可以说是最重要的。这样做的麻烦在于,不可能总是说出一个论点是一条道路还是别的什么东西,或者在这种情况下,它是否实际上是一条不应该被翻译的道路。翻译由set of heuristics指导。

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

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

+0

谢谢 - 该链接(启发式)帮我“假了” MinGW和通过不受干扰的方式获取我的路径。 –

+2

错误!如果关闭,有一种方法可以切换。 http://stackoverflow.com/a/34386471/404615 –

16

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

如果使用双斜杠启动路径,则MSYS不会将路径转换为DOS格式。因此,在OP的例子中,-rpath开关应该是这样规定的:

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

所有的Unix/Linux工具似乎处理这些虚假斜杠没有任何问题,所以即使你的二进制文件的rpath将与//开始usr/...我认为装载机会做正确的事情。

+6

它不适用于我,但-rpath =“// usr \ lib \ myrpath”(带有引号和反斜杠的路径) –

+0

甜!这个技巧完全为我工作。谢谢! – BrandonLWhite

+0

这一个工程,也请参阅http://stackoverflow.com/a/34386471/404615 –

0

不幸的是,对于此示例而言,将两个正斜杠并不按预期工作。

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

我想“rsync的”只在/应用程序,以排除文件/日志是在顶层,因此领先的斜线。添加两个正斜杠不会导致它排除此目录。我不得不求助于不太准确的--exclude="application/logs/"

+0

请参阅http://stackoverflow.com/a/34386471/404615 –

36

还有is a way可通过在Windows Git MSys中设置MSYS_NO_PATHCONV=1MSYS2中的MSYS2_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 
+8

这是不正确的。这[[只添加到Git窗口的MSYS运行时分支](https://github.com/git-for-windows/msys2-runtime/pull/11),而'MSYS_NO_PATHCONV'变量不是**识别的由上游版本的MSYS:不是1.0,而不是MSYS2,不是32或64位变体。 –

+0

这非常棒。我希望它始终可用。感谢您指出。 – xer0x

+0

'MSYS2_ARG_CONV_EXC =“*”'被上游的MSYS2接受,并且执行相同的操作。它记录在https://sourceforge.net/p/msys2/wiki/Porting/这里 – Phyx