交叉编译ncurses-5.8 时出错,我用的是如下的A方法进行的configure
A:
../ncurses-5.8/configure --prefix=/home/rebi/cross_tools/build_ncurses-5.8/_install --host=arm-linux CC=arm-unknown-linux-gnueabi-gcc
B:
../ncurses-5.8/configure --prefix=/home/rebi/cross_tools/build_ncurses-5.8/_install --host=arm-unknown-linux-gnueabi
对于所有的交叉编译配置,我一直是用类似于A方法配置的,但今天ncurses编失败了,用B就成功了。
看来还是没有理解host参数的真正含义!!!configure实际上也是一样脚本,只是太大了,上万行,看来只能在这里面找答案了。
configure脚本中关于--host的处理部分:
-host | --host | --hos | --ho) ac_prev=host_alias ;;
-host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;;
。。。#可见,参数被赋给host_alias了,所以继续找用到host_alias的地方,果然
ac_tool_prefix=test -n "$host_alias" && ac_tool_prefix=$host_alias-#如果变量host_alias不为空,则给它后面加上一个“-”,然后赋于ac_tool_prefix这个变量。
ac_tool_prefix又在哪用到呢?
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2 #最终,这个ac_tool_prefix前缀会被追加到gcc的前面,于是,这样编生成了交叉编译器的名称,其它的如ar、strip、cc、as、objdump、ranlib也一样。
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
到这里,云开见日。
可见用方法A,手动指定CC=xxx的形式只是改了CC一个,但其它的如ld、ar等没有被一并修改,但通过--host参数会修改所有的与交叉编译相关的东西,所以这应该是问题的关键所在。
看来这里的host实际上是就是决定了编译器的前缀。
It is a long long way to go...