从 Makefile 调用时,MSYS2 shell 上的 ar 会收到截断的路径?
Posted
技术标签:
【中文标题】从 Makefile 调用时,MSYS2 shell 上的 ar 会收到截断的路径?【英文标题】:ar on MSYS2 shell receives truncated paths when called from Makefile? 【发布时间】:2016-05-28 23:18:08 【问题描述】:我正在使用来自 PortableGit 安装的 git-bash.exe,以及来自不同 MinGW 的环境变量。所以我有:
WORKGROUP+user@AD-X MINGW32 /z/user/Downloads
$ which ar
//WORKGROUP.EX.COM/Users/user/Downloads/mingw-w64/i686-4.9.3-posix-dwarf-rt_v4-rev1/mingw32/bin/ar
WORKGROUP+user@AD-X MINGW32 /z/user/Downloads
$ gcc --version | head -1
GNU ar (GNU Binutils) 2.25
现在我正在构建一个库,最后,链接步骤在调用 ar
命令时失败,如下所示:
ar -cr "Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/libsomeLibraryABCDebug.a" \
Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/obj/Debug/libs/someLibraryDEFGHI/test/someObject.o \
[...]
...其中列出了一堆对象 - 命令行长度为 10000 个字符,仍低于 PortableGit 的 MSYS2 shell (git-bash.exe
) 中的 32000 个 getconf ARG_MAX
。但是,我得到的失败是No such file or directory
:
\\WORKGROUP.EX.COM\Users\user\Downloads\mingw-w64\i686-4.9.3-posix-dwarf-rt_v4-rev1\mingw32\bin\ar.exe: Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/obj/Debug/libs/some: No such file or directory
... 给出的路径很明显是目标文件所在路径的截断版本。更奇怪的是,当我将make
进程打印的完整ar
命令行复制并粘贴回同一个终端时,它会正确完成吗?
有没有人知道为什么会发生这种情况,我可以做些什么来确保从 Makefile 调用 ar
时完成?
【问题讨论】:
【参考方案1】:好的,首先我在运行 ar
命令的 Makefile 中找到了,我在其中添加了 -v
开关(所以,-crv
)用于详细说明。
我可以发现大部分命令行都被读取,并添加了对象,直到它到达大约 8192 字节的命令行,之后它被截断,并且发生故障。这显然是一个已知问题:
How to avoid Max Command line size on Windows Solving the 8192 Character Command Line Limit on Windows | MCU on Eclipse...虽然,我不太清楚为什么它应该出现在已经在git-bash.exe
中运行的make
进程中,即 MSYS2 shell 中?!
无论如何,我使用的解决方法/修复是使用file option of make,因为只需从 Makefile 执行“@echo $CMD > arscript.sh”将再次仅将 8kb 截断的命令行保存到文件中;所以代替原来的调用:
@$(AR) $FLAGS_FOR_AR "$@" $(FILES_FOR_AR)
...我们将行保存到文件中,然后调用bash
将其解释为脚本;那就是:
$(file >arscript.sh,@$(AR) $FLAGS_FOR_AR "$@" $(FILES_FOR_AR))
bash -x arscript.sh
...这终于对我有用了。
【讨论】:
以上是关于从 Makefile 调用时,MSYS2 shell 上的 ar 会收到截断的路径?的主要内容,如果未能解决你的问题,请参考以下文章