emacs ./configure 在交叉编译 arm-linux-gnueabihf 时遇到缺少函数“tputs”

emacs ./configure 在交叉编译 arm-linux-gnueabihf 时遇到缺少函数“tputs”

我正在尝试通过 Arch 虚拟机为我的主设备上的 armv7l 系统交叉编译 Emacs,到目前为止,直到 ./configure 阶段为止我还没有遇到任何问题。我已经正确设置了构建、主机和目标参数,但遇到了这个问题:

“在任何库中都找不到所需的函数‘tputs’。已尝试(按顺序)以下库:libtinfo、libncurses、libterminfo、libtermcap、libcurses 请尝试安装最适合您的系统的库及其例如,libncurses-dev(el) 或类似的包。”

谷歌搜索了一下,我了解到

  1. 在 Debian 和 Ubuntu 上,libcurses-dev 是一个单独的开发包,您可以将其安装到您的系统中。
  2. 在 arch 上,libcurses-dev 中的内容包含在 ncurses 包中,并且不能单独使用

我相信配置文件正在搜索“libcurses-dev”包创建的资源,但找不到它,因为它根本不单独存在于 Arch 中。我发现这个线程有人在尝试编译自己的代码时提出了这个问题,解决方案是在他们的程序中包含“ncurses.h”,我在我的系统上的“/usr/include/ncurses.h”中看到了这一点。我如何对我的配置文件进行更改,或者将其添加为 ./configure 中的标志?

总的来说,我对 Linux 还很陌生,而且我正在不断学习,所以如果我在这里所做的事情明显错误,请告诉我!这些是我与 ./configure 一起使用的参数,仅用于上下文:

    ./configure --build=x86_64-pc-linux-gnu
--host=arm-linux-gnueabihf --target=host=arm-linux-gnueabihf
--with-x-toolkit=no --with-xpm=no --with-jpeg=no --with-png=no
--with-gif=no --with-tiff=no  --without-xml2 --without-gnutls --without-x
--without-dbus

谢谢你!

答案1

Arch Linux没有提供ncurses的交叉编译包(实际上我不知道任何ncurses 的交叉编译器包,所以这不是 Arch 的一个特殊缺陷)。

您可以使用搜索查询查看哪些包使用或提供 ncurses pacman,例如,

pacman -Ss ncurses

这样做,我看到二十个包,但只有第一个有用:

core/ncurses 6.2-2 [installed]
    System V Release 4.0 curses emulation library

根据指导方针,如果有一个包手臂,您会在列表中看到带有架构名称前缀的:

软件包名称不应以单词 cross- 为前缀(这是以前提出的,但没有在官方软件包中采用,可能是由于名称的额外长度),并且应由软件包名称组成,前缀为 GNU 三元组,不带供应商字段或供应商字段中带有“未知”;示例:arm-linux-gnueabihf-gcc。如果存在较短的命名约定(例如 mips-gcc),则可以使用它,但不建议这样做。

Arch Linux恩诅咒包中包含头文件等开发文件(例如ncurses.h)。你可以看到使用

pacman -Q -l ncurses |grep /include/

这表明我

ncurses /usr/include/
ncurses /usr/include/curses.h
ncurses /usr/include/cursesapp.h
ncurses /usr/include/cursesf.h
ncurses /usr/include/cursesm.h
ncurses /usr/include/cursesp.h
ncurses /usr/include/cursesw.h
ncurses /usr/include/cursslk.h
ncurses /usr/include/eti.h
ncurses /usr/include/etip.h
ncurses /usr/include/form.h
ncurses /usr/include/menu.h  
ncurses /usr/include/nc_tparm.h
ncurses /usr/include/ncurses.h
ncurses /usr/include/ncurses_dll.h
ncurses /usr/include/panel.h    
ncurses /usr/include/term.h
ncurses /usr/include/term_entry.h
ncurses /usr/include/termcap.h
ncurses /usr/include/tic.h
ncurses /usr/include/unctrl.h

但是,会生成头文件(并且不一定对于每个配置都相同)。因此,交叉编译器包将为其头文件使用不同的路径名,以避免与核心 ncurses 包发生冲突。

由于没有包支持与 ncurses 交叉编译,解决方案似乎是使用配置脚本期望的文件命名约定来开发这些包。 Arch 似乎没有提供这方面的教程,但是评论关于这个主题暗示学习如何使用 distcc 是一个很好的方法。拱门的文档就这样开始

免责声明:如果您不确定自己在做什么,本指南将显得含糊且不完整。这是故意的。这不是专门为刚接触软件编译和工具链组件的用户设计的。

这是Arch Linux ARM 使用的官方交叉编译方法。如果您计划构建大量软件包并希望加快进程,以下指南将把 x86 Linux 计算机变成 ARM 交叉编译器。它也比大多数交叉编译设置容易得多。

本指南使用 distcc,以便不必在 x86 上构建完整的 ARM 开发环境。正如 distcc 项目网站所述,“distcc 不要求所有机器共享文件系统、同步时钟或安装相同的库或头文件。”这对我们来说特别有利,因为我们所需要的只是在更快的机器上运行 ARM 的交叉编译器,同时从具有所有当前库和头文件的 ARM 计算机控制构建。

相关内容