在是用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的這種編譯錯誤。