【发布时间】:2011-04-07 02:24:19
【问题描述】:
当我尝试在我的系统 (Fedora) 上构建这个库时
Linux localhost.localdomain 2.6.33.8-149.fc13.i686 #1 SMP Tue Aug 17 22:45:56 UTC 2010 i686 i686 i386 GNU/Linux
我得到一长串错误,这是最后几行:
build/makefiles/Makefile.top:542: warning: overriding commands for target `build-Linux-Linux-release-lib-static/src_charset_detect.o'
build/makefiles/Makefile.top:542: warning: ignoring old commands for target `build-Linux-Linux-release-lib-static/src_charset_detect.o'
COMPILE: src/hubbub.c
cc: error trying to exec '/usr/libexec/gcc/i686-redhat-linux/4.4.4/cc1': execv: Argument list too long
make: *** [build-Linux-Linux-release-lib-static/src_hubbub.o] Error 1
你可以下载这个错误出现的makefile:
http://www.touspassagers.org/downloadable/Makefile.top
我想我只需要分解 execv 的参数,所以没有那么多。在该文件出现的每个实例中,如何在该文件的上下文中执行此操作?我听说 xargs 是要走的路;但我不知道如何使用它。我对 bash 很陌生。
【问题讨论】:
-
cc1是编译器本身,是实际进行编译的部分(即预处理后的阶段,但组装前的阶段)。似乎您的工具链为编译器提供了太多的命令行选项(超出了您的操作系统允许的范围),这很奇怪,而且听起来也不对。您可以通过在<limits.h>中查找ARG_MAX来检查最大参数数。 POSIX 说必须支持至少 4096 个字符,如果您的操作系统有同样的限制,并且您向execv提供的字符超过此限制,它将失败。 -
实际上,经过仔细检查,
ARG_MAX似乎占了参数和环境变量的总字节数。execv可能返回E2BIG如果 “新进程映像的参数列表和环境列表使用的字节数大于系统强加的 {ARG_MAX} 字节限制。” -
哇,谢谢。我将其更改为有效的 URL。
-
@akellehe:是的,也许这是个好主意。除了使用更少的标志或更少的环境变量之外,我不确定他们还能做些什么来修复它。
-
遗憾的是,这个 Makefile 默认不显示实际的命令行。 @akellehe:如果六个月后这仍然相关,您能否尝试“
make Q= VQ=”(是的,等号后面没有任何内容,并确保Q=和VQ=之间有空格)并编辑结果输出到你的问题?这将使它显示它实际尝试做的事情,而不是仅仅说“COMPILE src/hubbub.c”这是无用的。