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)
Gur*_*ngh 33
我刚刚发现了一个巧妙的技巧来避免MSYS/MinGW为你翻译路径.
如果使用双斜杠启动路径,则MSYS不会将路径转换为DOS格式.所以在OP的例子中,应该像这样指定-rpath开关:
-Wl,-rpath=//usr/lib/myrpath
所有Unix/Linux工具似乎都没有任何问题处理这样的虚假斜线,所以即使你的二进制文件的rpath将以// usr/...开头,我认为加载器会做正确的事情.
SiZ*_*OUS 10
确实,在MinGW.org提供的原始MSYS项目中,没有办法禁用Posix 路径转换。
这就是为什么我对msys-core运行时做了一个小分支,它支持Git for WindowsMSYS_NO_PATHCONV分支引入的标志。这样,您可以像在Windows 的 Git中一样使用环境变量,但在原始的MinGW/MSYS中。MSYS_NO_PATHCONV
总之,要禁用此 Posix 路径转换:
MSYS2_ARG_CONV_EXCL="*"MSYS_NO_PATHCONV=1MSYS_NO_PATHCONV=1.我认为没有办法将其关闭.MSYS是旧的Cygwin版本的一个分支,其中包含许多旨在改进Windows集成的调整,其中调用本机Windows程序时自动POSIX路径转换可能是最重要的.这样做的问题在于,并不总是可以判断一个参数是一个路径还是其他东西,或者是否,就像在这种情况下,它实际上是一条不应该被翻译的路径.翻译由一组启发式指导.
您可以尝试使用MinGW make而不是MSYS make(是的,它们是不同的东西),这是没有POSIX路径支持和转换的本机Windows版本的make.安装mingw-get install mingw32-make和调用as mingw32-make.
或者你可以尝试Cygwin,理想情况下使用工具链的Cygwin构建.
| 归档时间: |
|
| 查看次数: |
17730 次 |
| 最近记录: |