And*_*rew 28 make error-handling gnu-make
我正在尝试编译一个用 Fortran 编写的程序make
(我有一个Makefile,在包含Makefile的目录中,我输入命令$ make target
,其中“目标”是我的Makefile 中存在的系统特定的目标规范。正如我对我的目标规范的各种修订进行试验,我在尝试调用 时经常收到各种错误消息make
。举几个例子:
make[1]: Entering directory
/bin/sh: line 0: test: too many arguments
./dpp angfrc.f > angfrc.tmp.f
/bin/sh: ./dpp: Permission denied
make[1]: *** [angfrc.o] Error 126
make[1]: Leaving directory
make: *** [cmu60] Error 2
Run Code Online (Sandbox Code Playgroud)
和
make[1]: Entering directory
/bin/sh: line 0: test: too many arguments
./dpp -DSTRESS -DMPI -P -D'pointer=integer'-I/opt/mpich_intel/include angfrc.f > angfrc.tmp.f
/bin/sh: ./dpp: Permission denied
make[1]: *** [angfrc.o] Error 126
make[1]: Leaving directory
make: *** [mpich-c2] Error 2
Run Code Online (Sandbox Code Playgroud)
和
make[1]: Entering directory
/bin/sh: line 0: test: too many arguments
./dpp -DSTRESS -DMPI -P -D'pointer=integer' -I/opt/mpich_intel/include angfrc.f > angfrc.tmp.f
/bin/sh: ./dpp: Permission denied
make[1]: *** [angfrc.o] Error 126
make[1]: Leaving directory
make: *** [mpi-intel] Error 2
Run Code Online (Sandbox Code Playgroud)
您知道我如何找到错误代码的列表,例如“错误 126”和“错误 2”的含义吗?我在另一个网站上找到了这个帖子,但我不确定回复的意思。这是否意味着make
错误代码没有独立于系统的含义?你能帮我么?谢谢你。
Gil*_*il' 30
错误代码不是来自 make:make 正在报告失败命令的返回状态。您需要查看每个命令的文档以了解每个状态值的含义。除了 0 = 成功,其他任何 = 失败之外,大多数命令不会打扰其他区别。
在您的每个示例中,./dpp
都无法执行。发生这种情况时,试图调用它的 shell 会以状态代码 126 退出(这是标准行为)。运行该 shell 的 make 实例检测到失败的命令(shell)并退出,显示Error 126
. make 的那个实例本身就是一个由 make 的父实例执行的命令,并且该make
实用程序在出错时返回 2,因此父 make 报告Error 2
.
您构建的失败很可能源于test: too many arguments
. 这可能是 makefile 中的语法错误,或者可能是由于当您拥有/bin/sh
非 bash时依赖于特定于 bash 的功能。尝试运行make SHELL=/bin/bash target
或make SHELL=/bin/ksh target
; 如果这不起作用,您需要修复您的makefile。
小智 16
澄清一下,Make 总是返回三个错误代码之一,如gnu.org 所述:
您可以通过运行上面的示例(假设您仍然拥有 2011 年的示例)来测试这一点,然后echo $?
在终端中运行以打印之前的返回码。
Make 会打印出它遇到的其他错误代码(比如你找到的 126),但如果遇到错误,它总是会返回错误代码 2。