【问题标题】:GNU Make can never find perl?GNU Make 永远找不到 perl?
【发布时间】:2011-06-11 15:39:26
【问题描述】:

编译程序时有时会出现此错误:

make[1]: /usr/bin/perl: Command not found
make[1]: *** [links] Error 127

任何需要 perl 编译的程序都会发生这种情况,例如 openssl 和 automake。然而:

sh-2.05b# perl -v

This is perl, v5.10.0 DEVEL34342 built for arm-linux-thread-multi
(with 1 registered patch, see perl -V for more detail)

sh-2.05b# /usr/bin/perl -v

This is perl, v5.10.0 DEVEL34342 built for arm-linux-thread-multi
(with 1 registered patch, see perl -V for more detail)

我肯定安装了 perl。怎么回事?

【问题讨论】:

  • 您在什么样的系统上开发了脚本(和生成文件)?实际文件是否最初来自 Windows 系统?
  • 嗯,这消除了一种可能性(在 /usr/bin/perl 定义的末尾有一个不可见的 ^M,因为文件是从不同的操作系统导入而没有转换的)。跨度>
  • 这很奇怪。你能告诉我们makefile规则吗? (注意它是递归调用的。)
  • 我的第一个猜测是 Perl 安装在 /usr/bin 以外的其他地方。尝试在命令行中输入“which perl”或“type perl”来找出 Perl 的安装位置。
  • 好吧,我通过直接调用 make 来解决这个问题。由于某种原因,如果被另一个脚本调用,它不会找到 perl。

标签: perl makefile compilation arm gnu-make


【解决方案1】:

如果这是可重现的,请使用strace -f 运行make 命令,以明确查看哪个命令正在尝试(和失败)执行。

根据我自己的经验,我可以回忆起以下两种情况,其中exec-family 可能会在带有ENOENT 的 Linux 上失败,尽管该命令实际上存在:

  1. 二进制文件引用的.interp 不存在(例如:LSB 兼容二进制文件引用/lib/ld-lsb.so.3 而不是通常的/lib/ld-linux.so.2,并且Linux 机器上没有安装LSB 兼容包)。在您的情况下似乎不太可能:)
  2. 一些内核级非标准安全机制已经到位,阻止了二进制文件的执行,尤其是在锁定的嵌入式设备上。在这种情况下,有人会认为EACCES 是更合乎逻辑的错误号,但也许ENOENT 用于防止将有关二进制文件存在的信息泄露给非特权进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多