這裏選用ubuntu 64bit 16.04的系統
參考到:
https://blog.csdn.net/qq_39436605/article/details/9008136
https://blog.csdn.net/weixin_30363817/article/details/9526648
目錄
1./bin/sh: 1: pushd: not found錯誤
9.internal compiler error: Killed
1./bin/sh: 1: pushd: not found錯誤
不能壓棧入棧,因爲pushd命令需要在bash的環境中執行,所以需要修改系統默認shell爲bash
- 步驟1.which sh,結果是/bin/sh
- 步驟2.ls -l /bin/sh,結果sh指向dash
- 步驟3.sudo rm /bin/sh
- 步驟4.sudo ln -s /bin/bash /bin/sh
- 步驟5.ls -l /bin/sh,結果sh指向bash
2.交叉編譯配置錯誤
make[2]: arm-hisiv300-linux-gcc: Command not found
原因
-
交叉編譯工具鏈未安裝。
-
由於嵌入式單板的資源有限,不能在單板上運行開發和調試工具,通常需要交叉編譯調試的方式進行開發和調試,即“宿主機+目標機(評估板)”的形式。
-
宿主機和目標機的處理器一般不相同。宿主機需要建立合適於目標機的交叉編譯環境。程序在宿主機上經過“編譯-鏈接-定位”得到可執行文件。通過一定的方法將可執行文件燒寫到目標機中,然後再目標機上運行。所謂的交叉編譯也就是A機編譯,B機運行。
-
發佈包提供兩種編譯工具鏈arm-hisiv300-linux 和 arm-hisiv400-linux,其中 arm-hisiv300-linux 爲基於 uclibc 的工具鏈, arm-hisiv400-linux 爲基於 glibc 的工具鏈。 uclibc比 glibc要小很多,因此我們選用arm-hisiv300-linux。
解決方法
- 步驟1,進入工具鏈及其安裝程序的目錄位置:Hi3518E_SDK_V1.0.3.0/osdrv/opensource/toolchain/arm-hisiv300-linux
- 步驟2,解壓工具鏈:tar -xvf arm-hisiv300-linux.tar.bz2
- 步驟3,安裝工具鏈:sudo ./cross.install.v300
- 步驟4,進入交叉編譯工具鏈的掛載目錄:cd /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin
- 步驟5,ls 【發現裏面有很多arm-hisiv300-linux-uclibcgnueabi-xxx編譯工具鏈】
- 步驟6,file file arm-hisiv300-linux-uclibcgnueabi-gcc 【ELF 32-bit LSB executable,也就是說這個交叉編譯工具鏈是32位的,但是我是用的虛擬機上Ubuntu16.04是64位的,因此必須安裝32位的兼容包】
- 步驟7,cd ../target/bin
- 步驟8,ls 【發現裏面有很多arm-hisiv300-linux-xxx編譯工具鏈,這些是arm-hisiv300-linux-uclibcgnueabi-xxx的符號鏈接,就是我們要找的arm-hisiv300-linux工具鏈,可以用ls -l查看】
- 步驟9,pwd 【/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin,記住這個路徑,需要將這個路徑導入到環境變量中:見步驟9,10】
- 步驟10,vi ~/.bashrc,在文件末尾追加export PATH=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin:$PATH
- 步驟11,source ~/.bashrc 【確保環境變量設置生效.,可以用echo $PATH查看是否成功導入】
- 步驟12,ping www.baidu.com 【確保虛擬機能上網】
- 步驟13,sudo aptitude install lib32z1 【注意:要安裝任何軟件之前,一定要確保虛擬機能上網】
- 步驟14,sudo aptitude install lib32stdc++6-4.8-dbg 【注意:要安裝任何軟件之前,一定要確保虛擬機能上網】
3.32位庫問題
Ubuntu16.04 error while loading shared libraries: libstdc++.so.6解決方法
https://blog.csdn.net/chxw098/article/details/79470508
解決方法:apt install lib32stdc++6-4.8-dbg
4.uboot編譯出錯了,未能找到mkimage
解決方法:
將編譯生成的mkimage工具放到我們全局的文件夾下,能訪問的到。
5.缺少zlib庫錯誤
問題定位:系統中沒有安裝zlib的庫
解決方法有兩個:
1)在我們使用的SDK中Hi3518E_SDK_V1.0.4.0是有這個工具的
zlib.h在osdrv/tools/pc/zlib/tmp/include目錄中有,只需要複製到osdrv/tools/pc/jffs2_tool/tmp/include目錄中即可。注意同時要將zconf.h也複製過去的。還有,要將tools/pc/jffs2_tool/tmp/lib目錄下的libz.a libz.so libz.so.1 libz.so.1.2.7等4個文件複製到tools/pc/jffs2_tool/tmp/lib目錄下。
[root@Mrtan pc]# ls
cramfs_tool jffs2_tool mkimage_tool nand_production ubifs_config zlib
ext4_utils lzma_tool mkyaffs2image squashfs4.2 uboot_tools
[root@Mrtan pc]# cd jffs2_tool/
[root@Mrtan jffs2_tool]# ls
lzo-2.09.tar.gz Makefile mtd-utils-1.5.0.tar.bz2 tmp
[root@Mrtan jffs2_tool]# cd tmp/
[root@Mrtan tmp]# ls
include lib lzo-2.09 mtd-utils-1.5.0 share
[root@Mrtan tmp]# cp ./../../zlib/tmp/include/zlib.h ./include/
[root@Mrtan tmp]# cp ./../../zlib/tmp/include/zconf.h ./include/
[root@Mrtan tmp]# cp ./../../zlib/tmp/lib/
libz.a libz.so libz.so.1 libz.so.1.2.7 pkgconfig/
[root@Mrtan tmp]# cp ./../../zlib/tmp/lib/* ./lib/
cp: omitting directory ‘./../../zlib/tmp/lib/pkgconfig’
[root@Mrtan tmp]# pwd
/work/hi3518e/Hi3518E_SDK_V1.0.4.0/osdrv/tools/pc/jffs2_tool/tmp
[root@Mrtan tmp]#
5.serve_image.c:32:18: error: storage size of ‘hints’ isn’t known
原因
在於ubuntu操作系統版本太高,而SDK使用的mtd-utils版本太低導致
解決方法
修改操作系統頭文件/usr/include/netdb.h,將此宏__USE_XOPEN2K註釋,如下圖(注意#ifdef與#endif是一一對應的)
- 步驟1,sudo vi /usr/include/netdb.h
- 步驟2,:set nu 【顯示行號】
- 步驟3,/__USE_XOPEN2K 【搜索】
- 步驟4,將第79行的#if defined __USE_XOPEN2K || defined __USE_XOPEN_EXTENDED和相應的第82行的#endif用//註釋掉
- 步驟5,/__USE_XOPEN2K 【搜索】
- 步驟6,第565行的#ifdef __USE_XOPEN2K和第681行的的#endif用//註釋掉 【用:681命令跳轉到681行】
進入osdrv,繼續編譯
make OSDRV_CROSS=arm-hisiv300-linux CHIP=hi3518ev200 all
6.
關於這個問題,在這個鏈接中有詳細的描述:
https://blog.csdn.net/weixin_30363817/article/details/95266483
mkfs.ubifs/hashtable/hashtable_itr.c:42:1: error: redefinition of ‘hashtable_iterator_key’
-----------
Makefile:204: recipe for target 'hipctools' failed
原因:
mtd-utils_1.5.0.tar.bz2 庫的問題,大家可以更新到 mtd-utils_1.5.2.tar.bz2 重新編譯就可以了;
mtd-utils_1.5.2.tar.bz2的下載地址:http://nl.archive.ubuntu.com/ubuntu/pool/universe/m/mtd-utils/mtd-utils_1.5.2.orig.tar.bz2
分析以及解決方案
總結:經過百度搜索以及各種探索,發現我不能解決這個問題,因此決定把這個問題跳過去
分析
根據打印的錯誤信息分析,因爲:
mkfs.ubifs/hashtable/hashtable_itr.c:42:1: error: redefinition of ‘hashtable_iterator_key’
-----------
Makefile:204: recipe for target 'hipctools' failed
所以要研究總Makefile裏面的'hipctools'部分:
hipctools: prepare
@echo "---------task [5] build tools which run on pc"
make -C $(OSDRV_DIR)/tools/pc/mkyaffs2image/
cp $(OSDRV_DIR)/tools/pc/mkyaffs2image/bin/$(YAFFS_TOOL) $(OSDRV_DIR)/pub/bin/pc
make -C $(OSDRV_DIR)/tools/pc/jffs2_tool/
cp $(OSDRV_DIR)/tools/pc/jffs2_tool/mkfs.jffs2 $(OSDRV_DIR)/pub/bin/pc
cp $(OSDRV_DIR)/tools/pc/jffs2_tool/mkfs.ubifs $(OSDRV_DIR)/pub/bin/pc
cp $(OSDRV_DIR)/tools/pc/jffs2_tool/ubinize $(OSDRV_DIR)/pub/bin/pc
7.ncurses or ncursesw error
configure: error: ncurses or ncursesw selected, but library not found (--without-ncurses to disable)
步驟1,sudo apt-get install libncurses5-dev libncursesw5-dev
8.cramfs錯誤
然後到了這裏,就是之前centos系統遇到到問題,這裏單獨看是沒辦法解決的。其實我們這裏並沒有用到cramfs,所以我們要去修改Makefile
9.internal compiler error: Killed
這個問題,主要我實在阿里雲服務器上實驗的,配置不怎麼高,所以導致這個問題,經過查找,發現可能是內存不夠
參考到:https://blog.csdn.net/little_stupid_child/article/details/79188015
內存不足引起“gcc: internal compiler error: Killed (program cc1plus)”以及解決辦法
解決方法:
主要問題是內存不足導致的,可以通過增加swap交換分區來解決
操作:
sudo mkdir -p /var/cache/swap/
sudo dd if=/dev/zero of=/var/cache/swap/swap0 bs=1M count=512
sudo chmod 0600 /var/cache/swap/swap0
sudo mkswap /var/cache/swap/swap0
sudo swapon /var/cache/swap/swap0
然後還有一個可能是譯錯誤:/usr/bin/ld: i386:x86-64 architecture of input file `mkyaffs2image.o' is incompatible with i386 output
這個是因爲sdk中本來就有在64位系統下編譯的.o文件,而我們用的是32位的ubuntu,解決辦法是進入tools/pc/mkyaffs2image/mkyaffs2image目錄下,rm *.o(或者make clean)刪除所有之前編譯的痕跡即可。
10 結果
出現---------finish osdrv work,表示整個osdrv編譯成功
- 總結:此時只有mkfs.ubifs/hashtable/hashtable_itr.c:42:1: error: redefinition of ‘hashtable_iterator_key’被跳過了。拍攝快照。
11 查看成果
查看:
- cd /work/hi3518e/Hi3518E_SDK_V1.0.4.0/osdrv/pub/image_uclibc
4.8M rootfs_hi3518ev200_128k.jffs2
4.8M rootfs_hi3518ev200_256k.jffs2
12M rootfs_hi3518ev200_2k_4bit.yaffs2
4.8M rootfs_hi3518ev200_64k.jffs2
273K u-boot-hi3518ev200.bin
2.6M uImage_hi3518ev200
因爲我們是在/work/hi3518e/Hi3518E_SDK_V1.0.4.0/osdrv/pub/bin/pc下,放置了mkfs.jffs2工具,所以在最後生成的文件系統中是有一個yaffs的文件,若需要其他類型的文件系統,也需要將相應的可執行程序放入該目錄下
如果我們在編譯時,前面的uboot,kernel編譯都沒問題,只是後面的rootfs出現問題,我們在執行編譯命令時,是會全部重新編譯。其實我們也有方法做到只編譯後面的部分的,那就是去更改Makefile.
比如在Makefile中的:
hiboot:prepare 的內容就只留下一段echo
hikernel:prepare下也是如此
其實對應的hibusybox 部分也是可以幹掉的
然後hipctools:prepare下也只剩一條echo
hiboardtools是將來會編譯用到板子中去的,所以主要是busybox和boardtools我們都是需要的