perl - 如何在嵌入式系统上安装缺少的 perl 模块?

标签 perl embedded-linux

我在嵌入式系统上运行 Linux,特别是在 Cyclone V FPGA 上运行 Yocto Linux。我能够以最基本的形式使用 Perl,但我无法加载任何 Perl 模块。例如,当尝试使用 GetOpt::Long 模块时,我收到以下错误

root@socfpga_cyclone5:/mnt/sdcard# ./test.pl
Can't locate Getopt/Long.pm in @INC (@INC contains:
  /etc/perl
  /usr/lib/perl/site_perl/5.14.2/
  /usr/lib/perl/site_perl/5.14.2
  /usr/lib/perl/vendor_perl/5.14.2/
  /usr/lib/perl/vendor_perl/5.14.2
  /usr/lib/perl/5.14.2/
  /usr/lib/perl/5.14.2
  /usr/local/lib/site_perl
  /usr/lib/perl/5.14.2
  .) at ./test.pl line 3.
BEGIN failed--compilation aborted at ./test.pl line 3.

有人知道我该如何安装这些模块吗?模块是否完全依赖于硬件架构?从某个来源复制并粘贴 .pm 文件是否合理(我在哪里可以找到和下载这些 .pm 文件)?

最佳答案

我知道你的问题已经有两年多了,但这是一个很好的问题,我很遗憾没有人回答它。

perl 生态系统非常庞大,而全功能 perl 安装的磁盘占用空间在嵌入式系统上是个问题。因此,当您将 perl 添加到您的图像时,只安装了一个最小的系统。其他 perl 模块可作为 bitbake 包使用。

大多数时候,您可以从配方中找出配方提供哪些包,但 perl 配方非常复杂。找出 perl 配方构建了哪些包的最简单方法是构建它 (bitbake perl),然后查看 packages-split 目录,您可以在 bitbake 工作目录中找到该目录。对于我的系统(皮质 A8),看起来像这样:

$ ls -1 /poky/build/tmp/work/cortexa8hf-vfp-neon-poky-linux-gnueabi/perl/5.20.0-r1/packages-split
perl
perl-dbg
perl-dev
perl-doc
perl-lib
perl-lib.shlibdeps
perl-misc
perl-misc.shlibdeps
perl-module-anydbm-file
perl-module-app-cpan
perl-module-app-prove
perl-module-app-prove-state
(...)

如果列出了您想要的模块,只需将其添加到 IMAGE_INSTALL 中,如下所示:

IMAGE_INSTALL += "\
    perl \
    perl-module-base \
    perl-module-bytes \
    perl-module-data-dumper \
    perl-module-digest-md5 \
    perl-module-file-spec \
    perl-module-file-spec-functions \
    perl-module-findbin \
    perl-module-getopt-long \
    (...)"

如果您想要一个尚未构建的模块,您需要使用 cpan 类为它制作自己的配方。请参阅 poky/meta/recipes-extended/perl/poky/meta/recipes-lsb4/perl 中的示例。

编辑,我对在嵌入式系统上使用 perl 不是很满意。最大的问题是将依赖解决延迟到运行时。这太容易搞砸了,最终导致 Can't locate foobar.pm in @INC 错误。

关于perl - 如何在嵌入式系统上安装缺少的 perl 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037681/

相关文章:

arm - 如何访问 PWM 背光驱动?

linux-kernel - 如何将设备树 blob 添加到 Linux x86 内核启动?

linux - Docker容器在运行时立即退出

arrays - 如何在Perl中将重复值添加到数组?

perl - 如何用大写字母替换特定字符?

python - 使用充当 UDP 回显的程序确定服务器可用性

perl - 为什么 Perl 的 quotemeta() 函数在调试器下表现不同?

perl - 双箭头 (=>) 运算符在 Perl 中如何工作?

linux - 通过Bootloader和Kernel查询SoC的寄存器初始化

c - 如何将 fork() 移植到 Vxwork