編譯hisi3518e在ubuntu平臺

這裏選用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錯誤

2.交叉編譯配置錯誤

3.32位庫問題

4.uboot編譯出錯了,未能找到mkimage

7.ncurses or ncursesw error

8.cramfs錯誤

9.internal compiler error: Killed

10 結果

11 查看成果



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

原因

  1. 交叉編譯工具鏈未安裝。

  2. 由於嵌入式單板的資源有限,不能在單板上運行開發和調試工具,通常需要交叉編譯調試的方式進行開發和調試,即“宿主機+目標機(評估板)”的形式。

  3. 宿主機和目標機的處理器一般不相同。宿主機需要建立合適於目標機的交叉編譯環境。程序在宿主機上經過“編譯-鏈接-定位”得到可執行文件。通過一定的方法將可執行文件燒寫到目標機中,然後再目標機上運行。所謂的交叉編譯也就是A機編譯,B機運行。

  4. 發佈包提供兩種編譯工具鏈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我們都是需要的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章