第 5 章 crosstool-ng常见问题及解决办法

目录

5.1. 安装crosstool-ng工具本身的阶段常见问题及解决办法
5.1.1. 缺少一些开发相关的工具
5.1.1.1. configure: error: missing required tool: bison
5.1.1.2. configure: error: missing required tool: flex
5.1.1.3. configure: error: missing required tool: gperf
5.1.1.4. configure: error: missing required tool: makeinfo
5.1.1.5. configure: error: could not find GNU awk
5.1.1.6. configure: error: could not find GNU libtool >= 1.5.26
5.1.1.7. configure: error: could not find GNU automake >= 1.10
5.1.1.8. configure: error: could not find curses header, required for the kconfig frontends
5.1.2. 在Cygwin下出现的一些问题
5.1.2.1. zconf.tab.o:zconf.tab.c:(.text+0x162a): undefined reference to ‘_libintl_gettext'
5.1.2.2. lxdialog/menubox.o:menubox.c:(.text+0x7d): undefined reference to `_wattrset'
5.1.2.3. nconf.c:1521:2: error: lvalue required as left operand of assignment
5.1.2.4. bash: ct-ng: command not found
5.1.2.5. Win7下无法编辑保存Cygwin中的文件
5.2. crosstool-ng在编译阶段常见问题及解决办法
5.2.1. 不论何种平台下编译crosstool-ng常见错误及解决办法
5.2.1.1. scripts/unifdef.c:209:25: error: conflicting types for ‘getline'
5.2.1.2. Build failed in step ‘Extracting and patching toolchain components’,in function ‘CT_DoExecLog’ (line unknown, sorry)
5.2.1.3. [libgcc/./_powisf2.o] Error 1,/tmp/cc7Xh6xp.s:21: Error: selected processor does not support ARM mode `fmsr s14,r0′
5.2.1.4. .build/arm-xscale-linux-gnueabi/buildtools/include/cloog/ppl_backend.h:54: undefined reference to `_ppl_finalize'
5.2.1.5. Makefile:240: *** mixed implicit and normal rules. Stop.
5.2.1.5.1. 手动修改每个Makefile中对应的混合规则->使得3.82的make可以识别
5.2.1.5.2. 把3.82的make换成3.81版本的make
5.2.1.5.2.1. 把你当前的(Linux或Cygwin等)系统环境中的3.82的make换成3.81的make
5.2.1.5.2.2. 用crosstool-ng中提供的3.81的make(而不用更换系统环境中的3.82的make)
5.2.2. Cygwin下编译crosstool-ng常见错误及解决办法
5.2.2.1. Cygwin下编译crosstool-ng时导致内存泄露
5.2.2.2. Your file system in ‘xxx/targets’ is *not* case-sensitive!
5.2.3. Linux下编译crosstool-ng常见错误及解决办法
5.2.3.1. gcc-4.2.2/gcc/regrename.c:1646:12: error: ‘IFCVT_ALLOW_MODIFY_TEST_IN_INSN’ undeclared (first use in this function)

相关旧帖:【总结】crosstool-ng使用心得和注意事项

5.1. 安装crosstool-ng工具本身的阶段常见问题及解决办法

安装crosstool-ng工具本身,也常会遇到一些小问题。

5.1.1. 缺少一些开发相关的工具

比如,在configure和make等时候,提示你缺少一些工具,版本等不满足要求之类的错误。

这时候,基本的逻辑都是:

搞清楚当前缺少的是哪个(版本的)工具,然后去安装上去,即可。

[注意] 当cygwin下缺失某软件包时请重新安装Cygwin且全选整个Develop那组的所有软件包

注意,如果这些问题,是发生在Cygwin下,那么,则需要你去安装对应的软件包。

其中,比较好的做法是:

在安装Cygwin的时候,对于Developmen那个分类,全部都安装。

详见:

Cygwin详解

5.1.1.1. configure: error: missing required tool: bison

在Ubuntu下,解决办法是:

sudo apt-get install bison

详见:【记录】在Ubuntu下用crosstool-ng编译xscale的交叉工具链

5.1.1.2. configure: error: missing required tool: flex

在Ubuntu下,解决办法是:

sudo apt-get install flex

详见:【记录】在Ubuntu下用crosstool-ng编译xscale的交叉工具链

5.1.1.3. configure: error: missing required tool: gperf

在Ubuntu下,解决办法是:

sudo apt-get install gperf

详见:【记录】在Ubuntu下用crosstool-ng编译xscale的交叉工具链

5.1.1.4. configure: error: missing required tool: makeinfo

在Ubuntu下,解决办法是:

sudo apt-get install texinfo

详见:【已解决】Ubuntu中用sudo apt-get install安装某软件,结果出错:E: Unable to locate package makeinfo

5.1.1.5. configure: error: could not find GNU awk

在Ubuntu下,解决办法是:

sudo apt-get install gawk

详见:【记录】在Ubuntu下用crosstool-ng编译xscale的交叉工具链

5.1.1.6. configure: error: could not find GNU libtool >= 1.5.26

在Ubuntu下,解决办法是:

sudo apt-get install libtool

详见:【已解决】Ubuntu下去配置crosstool-ng时出现:configure: error: could not find GNU libtool >= 1.5.26

5.1.1.7. configure: error: could not find GNU automake >= 1.10

在Ubuntu下,解决办法是:

sudo apt-get install automake

详见:【记录】在Ubuntu下用crosstool-ng编译xscale的交叉工具链

5.1.1.8. configure: error: could not find curses header, required for the kconfig frontends

在Ubuntu下,解决办法是:

sudo apt-get install libncurses5-dev

详见:【记录】在Ubuntu下用crosstool-ng编译xscale的交叉工具链

5.1.2. 在Cygwin下出现的一些问题

除了上述所说的,在Linux以及Cygwin下都可能会出现的一些问题之外,

在Cygwin环境下,还会出现一些,和Cygwin特定相关的一些问题:

5.1.2.1. zconf.tab.o:zconf.tab.c:(.text+0x162a): undefined reference to ‘_libintl_gettext'

错误现象:

cygwin下make编译crosstool-ng出错:


CLi@PC-CLI-1 ~/develop/crosstool-ng/crosstool-ng-1.18.0
$ make
  SED    'ct-ng'
  SED    'scripts/crosstool-NG.sh'
  SED    'scripts/saveSample.sh'
  SED    'scripts/showTuple.sh'
  GEN    'config/configure.in'
  GEN    'paths.mk'
  GEN    'paths.sh'
  DEP    'nconf.gui.dep'
  DEP    'nconf.dep'
  DEP    'lxdialog/checklist.dep'
  DEP    'lxdialog/inputbox.dep'
  DEP    'lxdialog/util.dep'
  DEP    'lxdialog/textbox.dep'
  DEP    'lxdialog/yesno.dep'
  DEP    'lxdialog/menubox.dep'
  DEP    'mconf.dep'
  DEP    'conf.dep'
  BISON  'zconf.tab.c'
  GPERF  'zconf.hash.c'
  LEX    'lex.zconf.c'
  DEP    'zconf.tab.dep'
  CC     'zconf.tab.o'
  CC     'conf.o'
  LD     'conf'
zconf.tab.o:zconf.tab.c:(.text+0x162a): undefined reference to `_libintl_gettext'
zconf.tab.o:zconf.tab.c:(.text+0x47fe): undefined reference to `_libintl_gettext'
zconf.tab.o:zconf.tab.c:(.text+0x56ec): undefined reference to `_libintl_gettext'
zconf.tab.o:zconf.tab.c:(.text+0x58be): undefined reference to `_libintl_gettext'
zconf.tab.o:zconf.tab.c:(.text+0xc70b): undefined reference to `_libintl_gettext'
zconf.tab.o:zconf.tab.c:(.text+0xc719): more undefined references to `_libintl_gettext' follow
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: zconf.tab.o: bad reloc address 0x110 in section `.data'
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: final link failed: Invalid operation
collect2: ld returned 1 exit status
Makefile:108: recipe for target `conf' failed
make[2]: *** [conf] Error 1
Makefile:160: recipe for target `build-lib-kconfig' failed
make[1]: *** [build-lib-kconfig] Error 2
Makefile:120: recipe for target `build' failed
make: *** [build] Error 2

            

原因:

Cygwin下虽然已经安装了intl库,但是此处make编译的时候,没有链接进去,所以报错。

解决办法:

修改对应的Makefile文件:


crosstool-ng-1.18.0\kconfig\Makefile

            

去添加对应的intl库,即改为:


# What’s needed to build ‘conf’
conf_SRC = conf.c
conf_OBJ = $(patsubst %.c,%.o,$(conf_SRC))
conf_DEP = $(patsubst %.o,%.dep,$(conf_OBJ))
$(conf_OBJ) $(conf_DEP): CFLAGS += $(INTL_CFLAGS)
conf: LDFLAGS += -lintl

# What’s needed to build ‘mconf’
mconf_SRC = mconf.c
mconf_OBJ = $(patsubst %.c,%.o,$(mconf_SRC))
mconf_DEP = $(patsubst %.c,%.dep,$(mconf_SRC))
$(mconf_OBJ) $(mconf_DEP): CFLAGS += $(NCURSES_CFLAGS) $(INTL_CFLAGS)
#mconf: LDFLAGS += $(NCURSES_LDFLAGS)
mconf: LDFLAGS += -lintl $(NCURSES_LDFLAGS)

# What’s needed to build ‘nconf’
nconf_SRC = nconf.c nconf.gui.c
nconf_OBJ = $(patsubst %.c,%.o,$(nconf_SRC))
nconf_DEP = $(patsubst %.c,%.dep,$(nconf_SRC))
#$(nconf_OBJ) $(nconf_DEP): CFLAGS += $(INTL_CFLAGS) -I/usr/include/ncurses
#nconf: LDFLAGS += -lmenu -lpanel -lncurses
$(nconf_OBJ) $(nconf_DEP): CFLAGS += -I/usr/include/ncurses/ $(INTL_CFLAGS)
nconf: LDFLAGS += -lintl -lmenu -lpanel -lncurses

            
[注意] 此处也同时添加了ncurses库,解决了undefined reference to `_wattrset'的问题

此问题的解决,是在折腾:

【已解决】cygwin中编译crosstool-ng出错:zconf.tab.o:zconf.tab.c:(.text+0x162a): undefined reference to ‘_libintl_gettext'

时,去参考:

Re: crosstool-NG Cygwin Build Fails

而找到的解决办法。

可以看出,其中,在添加intl的同时,也同时去添加了对应的ncurses那个库。

那是因为,后期,同样会出现类似的错误第 5.1.2.2 节 “lxdialog/menubox.o:menubox.c:(.text+0x7d): undefined reference to `_wattrset'”

所以,此处,也加上对应的ncurses库,一并解决了类似的问题。

[小心] 此处不要通过make时加LDFLAGS参数去添加-lintl和-lcurses

其实,上面贴出来的,修改makefile的办法,的确已经解决了此处的,缺少intl和缺少ncurses的库的两个问题了。

只是,后来,在另外一个Cygwin环境下去折腾同样的make编译crosstool-ng的时候:

【记录】Cygwin下配置编译和安装crosstool-ng

由于之前解决上面这个问题的时候:

【已解决】Cygwin 1.7.17下make编译crosstool-ng出错:zconf.tab.o:zconf.tab.c:(.text+0x162a): undefined reference to `_libintl_gettext'

用的解决办法是:

不去修改makefile,而直接给make加上LDFLAGS参数加上-lintl:

make LDFLAGS="-lintl"

当时也是可以解决此问题的。

并且,接着去解决了:第 5.1.2.2 节 “lxdialog/menubox.o:menubox.c:(.text+0x7d): undefined reference to `_wattrset'”

用的方法也是,继续给make的LDFLAGS添加对应的-lcurses的参数:

make LDFLAGS="-lintl -lcurses"

然后,后来就出现,相对来说,至少到目前为止,没有完全搞懂的问题:

【已解决】Cygwin下make编译crosstool-ng出错:nconf.o:nconf.c:(.text+0×373): undefined reference to `_free_item’

觉得是属于比较诡异的问题。

而最终的解决办法是:

不要用make时给定LDFLAGS参数的方式去添加intl和curses的库

还是用上述的办法,修改对应的makefile,添加对应的intl的库,调整对应的


$(INTL_CFLAGS) -I/usr/include/ncurses

                

变成:


-I/usr/include/ncurses/ $(INTL_CFLAGS)

                

即可彻底解决此诡异的问题。

在该诡异问题的根本原因没有搞清楚之前,别人如果遇到类似的错误,还是参照此处,修改makefile去解决类似的问题。

5.1.2.2. lxdialog/menubox.o:menubox.c:(.text+0x7d): undefined reference to `_wattrset'

错误现象:

cygwin下make编译crosstool-ng出错:


Administrator@PC-20130611GART /home/develop/crosstool-ng/crosstool-ng-1.18.0
$ make LDFLAGS="-lintl"
  GEN    'config/configure.in'
  GEN    'paths.mk'
  GEN    'paths.sh'
  LD     'conf'
  CC     'lxdialog/menubox.o'
  CC     'lxdialog/yesno.o'
  CC     'lxdialog/textbox.o'
  CC     'lxdialog/util.o'
  CC     'lxdialog/inputbox.o'
  CC     'lxdialog/checklist.o'
  CC     'mconf.o'
  LD     'mconf'
lxdialog/menubox.o:menubox.c:(.text+0x7d): undefined reference to `_wattrset'
lxdialog/menubox.o:menubox.c:(.text+0x97): undefined reference to `_wmove'
......
mconf.o:mconf.c:(.text+0x13de): undefined reference to `_ncwrap_stdscr'
mconf.o:mconf.c:(.text+0x13e6): undefined reference to `_getcurx'
collect2: ld returned 1 exit status
Makefile:100: recipe for target `mconf' failed
make[2]: *** [mconf] Error 1
Makefile:160: recipe for target `build-lib-kconfig' failed
make[1]: *** [build-lib-kconfig] Error 2
Makefile:120: recipe for target `build' failed
make: *** [build] Error 2

Administrator@PC-20130611GART /home/develop/crosstool-ng/crosstool-ng-1.18.0$

            

原因:

Cygwin下虽然已经安装了ncurses库,但是此处make编译的时候,没有链接进去,所以报错。

解决办法:

参见:第 5.1.2.1 节 “zconf.tab.o:zconf.tab.c:(.text+0x162a): undefined reference to ‘_libintl_gettext'”中的此处也同时添加了ncurses库,解决了undefined reference to `_wattrset'的问题,去修改makefile而解决。

注意:参见之前此处不要通过make时加LDFLAGS参数去添加-lintl和-lcurses的解释,不要通过给make加LDFLAGS的方式去解决此问题,而是如上,使用修改makefile去解决此问题。

5.1.2.3. nconf.c:1521:2: error: lvalue required as left operand of assignment

错误现象:

cygwin下make编译crosstool-ng出错:


Administrator@PC-20130611GART /home/develop/crosstool-ng/crosstool-ng-1.18.0
$ make LDFLAGS="-lintl -lcurses"
  GEN    'config/configure.in'
  GEN    'paths.mk'
  GEN    'paths.sh'
  LD     'mconf'
  CC     'nconf.o'
nconf.c: In function 'main':
nconf.c:1521:2: error: lvalue required as left operand of assignment
Makefile:95: recipe for target `nconf.o' failed
make[2]: *** [nconf.o] Error 1
Makefile:160: recipe for target `build-lib-kconfig' failed
make[1]: *** [build-lib-kconfig] Error 2
Makefile:120: recipe for target `build' failed
make: *** [build] Error 2

            

原因:

nconf.c中(不知何故)无法找到对应的宏ESCDELAY,导致此处的代码:


ESCDELAY = 1;

            

变成一个未知的变量的左赋值,所以报此错误。

解决办法:

把对应的出错的文件:

crosstool-ng-1.18.0\kconfig\nconf.c

修改为:


//ESCDELAY = 1;
set_escdelay(1);

            

详见:

【已解决】Cygwin下make编译crosstool-ng出错:nconf.c:1521:2: error: lvalue required as left operand of assignment

5.1.2.4. bash: ct-ng: command not found

之前参考别人的教程:

Cygwin下用crosstool-ng 编译交叉工具链

去折腾crosstool-ng的时候,在Cygwin下面,遇到一个问题:

同样的去执行对应的命令:

echo "PATH=$PATH:/new/added/some/path" >> ~/.bashrc

但是echo.bashrc中的PATH的值,却是展开的。

从而,导致.bashrc中的内容,太乱,以至于无法正常执行。

所以,经过一番折腾,才发现,原来是,在Cygwin中,echo的值,包含环境变量的话,是需要转义的,即写为:

echo "PATH=\$PATH:/new/added/some/path" >> ~/.bashrc

才可以的。

【已解决】Cygwin中安装完crosstool-ng后,运行ct-ng help出错:bash: ct-ng: command not found

5.1.2.5. Win7下无法编辑保存Cygwin中的文件

实际上,此问题,不属于此处crosstool-ng方面的问题,只是和cygwin有关。

如果有人遇到类似的问题:

cygwin的文件,在Win7中(通过资源管理器)打开后,用编辑器打开,可以编辑,但是去保存时,无法保存。

则可以去参考Cygwin中的专门的解释:

Cygwin下的文件可以编辑但是无法保存