autotools,如果找不到交叉编译器,如何失败

Posted

技术标签:

【中文标题】autotools,如果找不到交叉编译器,如何失败【英文标题】:autotools, how to fail if cross compiler cannot be found 【发布时间】:2013-10-31 14:16:29 【问题描述】:

我使用 autoconf/automake 做了一个小项目。

该项目旨在进行本机编译和交叉编译,例如像这样:

./configure --host=arm-none-eabi

这很好用。但是一个问题是,如果没有安装交叉编译器,配置的脚本会忽略它,并使用安装的默认编译器愉快地编译它,例如

./configure --host=arm-none-eabi
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-none-eabi-strip... no
checking for strip... strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
checking whether make sets $(MAKE)... (cached) yes
checking for arm-none-eabi-gcc... no
checking for gcc... gcc
checking whether the C compiler works... yes

这里没有找到 arm-none-eabi-gcc。但它找到了本地 gcc,并继续使用本地编译器。

如果我使用 --host=XXXX 请求交叉编译并且找不到编译器,我可以在 configure.ac 中放入什么来让配置脚本停止并出错?

【问题讨论】:

【参考方案1】:

当您指定--host=<host-type>,并且此值与运行config.guess 脚本的结果不同时,autoconf 进入cross-compilation 模式。具体来说,变量cross_compiling设置为yes

如果配置脚本处于“交叉编译”模式,它无法运行任何生成的可执行文件,因此无法判断生成的二进制文件是否是有效的“主机”二进制文件。据推测,文件magic 值的大型数据库可能能够判断是否已生成有效的主机二进制文件。尽管在自动工具中积累了数十年的经验,但仍有一些组合问题无法跟上所有可能的架构和 ABI。

autoconf C 编译器tests 检查编译器(即$CC)是否可以构建可执行文件。 autoconf 可能会在编译器没有以主机三元组为前缀(例如 arm-none-eabi-gcc)时提供警告,但如果它找到工作编译器(例如本机 gcc)则不会“失败”。

因此,确保使用正确编译器进行交叉编译的唯一方法是指定编译器:

./configure --host=arm-none-eabi CC="arm-none-eabi-gcc"

如果此编译器无法构建可执行文件,则配置脚本将失败。

【讨论】:

以上是关于autotools,如果找不到交叉编译器,如何失败的主要内容,如果未能解决你的问题,请参考以下文章

如何交叉编译 动态库

linux家目录下找不到bashrc文件怎么回事,安装交叉编译工具用到该文件,但找不到该文件,这是怎么回事

autotools:autoreconf 找不到宏,但 aclocal 可以

为啥 GCC 交叉编译器找不到所有库?

autotools:C 编译器无法创建可执行文件

ARM 交叉编译器找不到包含的标准库