交叉编译gdb遇到no termcap library found的解决方法

在是用ejtag的时候缺少了gdb工具,因此自己需要手动编译一个gdb工具,编译过程中遇到了一些错误,翻阅了大量的网上资料解决了这些问题,从而也学习了一下交叉编译源码包的方法,这里做一个总结。

首先去官方网站下载gdb的源码包,我下载的7.4.1版本的源码包,解压开来,进入到源码包的根目录下。对于一个源码包,拿到手里首先要阅读的就是README,然后看一下INSTALL文件,这个文件里编译源码包的步骤。

基本上所有的源码包都是三步,configure,make,make install。

首先执行的就是./configure,这是一个配置的脚本。后面2步用到的很多很多配置都是在这里进行的,比如说编译所用的工具之类,所以交叉编译必须要配置这里,可以执行./configure --help查看后面参数的类型,对于交叉编译,主要就是有三个参数:--build --host --target。

System types:

--build=BUILD     configure for building on BUILD [guessed]

--host=HOST       cross-compile to build programs to run on HOST [BUILD]

--target=TARGET   configure for building compilers for TARGET [HOST]

--build参数是指你编译源码包的系统环境,可以通过查看系统的环境变量来获取,执行set命令可以看到  MACHTYPE=i686-pc-linux-gnu,则--build=i686-pc-linux-gnu。

--host参数指的是编译出来的工具运行在什么系统上,我编译出来的gdb是要运行在龙芯1b的开发板上,因此环境就是mipsel-linux的环境,如果你的是arm的开发板,就是arm-linux的环境。

--target参数指的是编译出的工具所要操作的系统,这个必须要理解明白,比如说我编译出来的gdb要在我的电脑上运行,但是要调试交叉编译出来的mips指令集的程序,这个时候呢,--target就要是mipsel-linux,但是--host是i686-pc-linux-gnu。

综上所述,交叉编译第一条命令应该是:

./configure --build=i686-pc-linux-gnu --host=mipsel-linux --target=mipsel-linux --prefix=/install.

第二步就是执行make,交叉编译gdb的时候make会出现下面这样一个错误:

configure: error: no termcap library found

make[1]: *** [configure-gdb] Error 1

make: *** [all] Error 2    很明显这是缺少一个termcap库,这是一个终端数据库,可以从官网下载一个版本的源码包,这里需要注意的是这个源码包也许要交叉编译,那是因为这个是你交叉编译gdb需要的库,在configure时可以指定--prefix指定安装目录,交叉编译安装完成后必须要将这个库放在交叉编译工具gcc(我的是mipsel-linux-gcc)的默认搜索库目录下。到你的交叉编译工具目录下,怎样查看默认搜索库的目录在哪里呢,执行下面的命令:

XXXXXXX-linux-gcc -print-file-name libc.a

就会显示出交叉编译工具所使用的库的默认搜索目录了。

然后将termap.h拷贝到默认目录下的include下,将libtermcap.a拷贝到默认目录下的lib下。

这样make时XXX-linux-gcc就可以找到这个库进行编译,make就可以通过啦!

然后make install,可以在configure时指定安装目录--prefix,这样便于寻找编译生成的工具。

这样我们就可以找到我们需要的gdb工具啦!

如果我们不交叉编译gdb,而是编译在本机上试用的gdb时nake不会碰到这个错误,那是因为本机gcc默认库搜索目录/usr/lib下有这个库libtermcap.a,但是这是一个链接文件,链接到了libncurses.a上,那是因为termcap库是一个比较老的终端数据库,现在都试用ncurses库代替,但是有些程序还是试用termcap库,所以系统中安装ncurses库时默认做一个链接文件,防止gdb的这种编译错误。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1a3598634d2f5e02b5b8108e4c75ec6d.html