在Windows上,我正在使用codesourery的交叉编译器套件为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,我将在可执行文件中获得正确的路径。如果我在MSYS命令行上调用GCC,就会得到修改过的rpath。如果我用在cmd.exe命令行中使用make运行的Makefile调用GCC,我仍然会得到一个混乱的rpath (!)
有什么办法可以关掉这个烦人的行为吗?
有一种方法可以通过在Windows Git MSys中设置MSYS_NO_PATHCONV=1
或在MSYS2中设置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
我刚刚发现了一个巧妙的技巧,可以避免MSYS/MinGW为您翻译路径。
如果你使用双斜杠开始路径,那么MSYS不会将路径转换为DOS格式。因此,在OP的示例中,-rpath开关应该这样指定:
-Wl,-rpath=//usr/lib/myrpath
所有的Unix/Linux工具似乎都可以毫无问题地处理这些虚假的斜杠,所以即使你的二进制文件的rpath以//usr/开始…我认为加载器会做正确的事情。
我不认为有办法关闭它。MSYS是旧Cygwin版本的一个分支,有许多旨在改进Windows集成的调整,其中调用本机Windows程序时的自动POSIX路径转换可以说是最重要的。这样做的问题是,我们并不总是能够分辨出一个参数是一条路径还是别的什么,或者,在这个例子中,它实际上是一条不应该被翻译的路径。翻译是由一组启发式指导的。
你可以尝试使用MinGW make而不是MSYS make(是的,它们是不同的东西),这是make的原生Windows版本,没有POSIX路径支持和转换。使用mingw-get install mingw32-make
安装并作为mingw32-make
调用。
或者您可以尝试Cygwin,最好使用Cygwin构建的工具链。
事实上,在MinGW.org提供的原始MSYS项目中,没有办法禁用Posix路径转换。
这就是为什么我做了一个msys-core运行时的小分支,它支持MSYS_NO_PATHCONV
标志,这是在Git for Windows分支中引入的。这样,您可以使用MSYS_NO_PATHCONV
环境变量,就像在Git for Windows中一样,但在原始的MinGW/MSYS中。
- 对于MSYS2(内置):
MSYS2_ARG_CONV_EXCL="*"
- Git For Windows(内置):
MSYS_NO_PATHCONV=1
- For MinGW.org (with msys-core-extended):
MSYS_NO_PATHCONV=1
.
export MSYS_NO_PATHCONV=1对于我在windows上使用git-bash的情况是必要的(如上面的dx_over_dt所述)。
不幸的是,在这个例子中使用两个正斜杠并没有像预期的那样工作。
rsync -rvztn --delete --exclude="/application/logs/" ...
我希望'rsync'只排除位于顶层的/application/logs文件,因此前面有正斜杠。添加两个正斜杠不会导致它排除此目录。我不得不求助于不太准确的--exclude="application/logs/"
。