在Ubuntu下安裝imx6linux系統的交叉編譯環境遇到的問題總結


  這段時間一直忙於手上的嵌入式項目,可以說自己從嵌入式的菜鳥一點點的入門了,關於嵌入式和imx6核心板的開發有了一點的了解,尤其是對於板子環境的搭建。硬件的開發,搭建環境,是一個很大的工程量,也是很重要的一步,環境沒有搭好就無法進行下一步。當然這個前提是對項目所使用的硬件有一定的了解。對於嵌入式開發,項目進行到現在,從一個什么都不懂的到現在可以和大家討論v4l2,framebuffer,討論linux的視頻開發,雖然還是菜鳥級別的,但這個月確實讓自己掌握了一們知識。

  關於嵌入式的開發,網上有很多的教程和步驟,大概就是按照以下的步驟:確定需求、根據需求硬件選型、確定硬件並對硬件熟悉,搭建開發環境,軟件部分,聯機調試,各硬件間的聯調,最后形成原型,裁剪系統,分裝。這里的每一步都很重要,不能輕忽任何一步。下面總結了在搭建開發環境這塊遇到的一些問題。不同的硬件有不同的要求,交叉編譯的環境也不一樣。

  在Linux下搭建開發環境,你必須對linux系統的環境配置要有所了解。

一、環境配置

1.1、什么是shell

Shell:又名殼層,是“提供用戶使用界面”的軟件,通常指的是命令行界面的解析器,在操作系統中,提供訪問內核所提供的服務的程序。

Shell:因為來自於操作系統(內核)與用戶界面的外層界面,通常將殼層分為兩類:命令行與圖形界面。 命令行殼層提供一個命令行界面(CLI); 而圖形殼層提供一個圖形用戶界面(GUI)。

bash 就是一個內置的shell程序,隸屬於命令行殼層。簡單的說,shell提供了一個接口,讓用戶輸入命令,接收用戶命令,然后調用相應的應用程序,就相當於dos的command。

1.2  環境的建立

  用戶登錄系統后,會啟動內置的bash程序,來讀取啟動文件的配置腳本,這些腳本定義了所有用戶共享的默認環境。 針對不通的用戶需求,會對操作系統的環境變 量進行修該,以滿足用戶需求,bash在讀取系統默 認的環境便變量后,會自動讀存儲在主目錄下用於定義個人環境的啟動文件,建立所需的環境。

1.3 啟動文件中有什么

shell會話分兩種:login shell 和 non-login shell 會話。

login shell 的啟動文件:

/etc/profile :適用於所有用戶的全局配置腳本

~./bash_profile :個人啟動文件,可擴展成全局配置腳本

~/.bash_login :

~/.profile

non-login shell:讀取的啟動文件

/etc/bash.bashrc :適用於所有用戶的全局配置腳本

~/.bashrc :用戶的個人啟動文件,而后集成父類進程環境。其中父類進程通常是一個login shell。

eg :  .bash_profile:

# .bash_profile
# cget the aliases and functions

if [ -f  ~/.bashrc ] ; then
             .   ~/.bashrc
fi

#  user specific enviroment and startup  programs

PATH = $PATH:$HOME / bin
export  PATH       

 # 開始的行是注釋行,shell不會讀取; 此段代碼被稱為 if 的復合命令

If the file “~/.bashrc ” exists , then read the "~/.bashrc" file

PATH=$PATH:$HOME / bin : 將$HOME / bin添加到了PATH值的尾部。

export 命令告訴shell,將shell的子進程使用PATH變量的內容。

 1.4 修改環境

  以上是系統啟動文件的位置和內容,可以通過修改系統啟動文件,來自定義個體環境。 環境變量的修改或者增加PATH目錄,需要在 .bash_profile 文件中操作,根據版本的不同而不同,比如Ubuntu使用的就是./profile文件。 其他的修改應該在 .bashrc 文件中 修改工具:vim

文本編輯器分成兩類:圖形界面的和基於文本的 Ubuntu下常用的是基於文本的vim

聯網安裝:sudo apt-get vim

卸 載:rm -Rf vim

打開文件:vim 文件名 (一定要進入當前路徑)

修改文件: a -->進入insert模式

退出文件:Esc + :+ (w,q, wq , q! ,wq! 等)

printenv : 打印部分或全部的環境信息

set : 設置shell選項

export : 將環境導出到隨后要運行的程序中

alias : 為命令創建一個別名

source:文件路徑/文件名

二、交叉編譯

 

  嵌入式系統開發過程中,運行程序的目標平台通常 具有有限的存儲空間和運算能力,比如常見的ARM 平台: 靜態存儲空間:16~32MB, CPU的主頻:100MHz~500MHz 因此,在ARM平台上不可能進行本機編譯,因為一般的編譯工具鏈(compilation tool chain)需要很大的存儲空間,並需要很強的CPU運算能力。 我們就可以在CPU能力很強、存儲控件足夠的主機平台 上(比如PC上)編譯出針對其他平台的可執行程序。PC機 資源豐富,可以很方便地集成開發環境和調試工具。

  由於PC機與嵌入式系統環境的體系結構不同, 在PC機上可以運行的程序在目標機arm板上無法運 行,因此嵌入式開發必須采用交叉編譯,以使PC機 可以生成在arm班上可以執行的代碼。 編譯的最主要的工作就是將程序轉化成運行該程序的CPU所能識別的機器代碼。此時就用到了交叉編譯鏈。 要進行交叉編譯,需要在主機平台上安裝交叉編譯工具鏈,然后用這個交叉編譯工具鏈編譯我們的源代碼,最終生成可以在目標平台上運行的代碼。

  什么是編譯工具鏈: 編譯工具鏈可簡單理解為編譯工具集: 編譯器,匯編器,鏈接器,C標准庫。 編譯器負責將源代碼轉換為二進制機器碼(或匯編代碼),像gcc; 匯編器和鏈接器等則負責可執行文件的構建,像 binutils,中文為二進制工具集; C標准庫是通用的機器碼庫,供鏈接器用,像 glibc。

大致流程:

安裝LTIB並編譯BSP

  1. 編譯Qt 4.8.5
  2. 安裝Qt 4.8.5
  3. 並配置ARM的交叉編譯
  4. ARM的交叉編譯

三、問題總結

關於環境配置時遇到的一些問題總結或者是知識梳理:

3.1、make命令簡介

  在開發一個系統時,一般是將一個系統分成幾個模塊, 這樣做提高了系統的可維護性,但由於各個模塊間不可避免 存在關聯,所以當一個模塊改動后,其他模塊也許會有所更 。為此,在Linux系統中,專門提供了一個make命令來自動維護目標文件。

  優點:只更新修改過的文件(在Linux中,一個文件被創建或更新后有一個最后修改時間,make命令就是通過這個最后修改時間來判斷此文件是否被修改),而對沒修改的文 件則置之不理,並且make命令不會漏掉一個需要更新的文件。

  依賴關系的確定: make命令當然不會自己知道這些依賴關系,需要程序 員將這些依賴關系寫入一個叫Makefile的文件中。 Makefile文件中包含着一些目標,通常目標就是文件名, 對每一個目標,提供了實現這個目標的一組命令以及和這個 目標有依賴關系的其他目標或文件名。

3.2、找不到zlib

  下面是涉及到的一點工具。

  LTIB(Linux Target Image Builder)工程是一個使用在不 同的目標平台下,用於開發和部署BSP(Board Support Packages)的簡單工具。使用該工具,用戶能夠為其目標平 台開發符合GNU/Linux標准的映像。

  BSP(Board Support Package)是板級支持包,是介於主 板硬件和操作系統之間的一層,應該說是屬於操作系統的一 部分,主要目的是為了支持操作系統,使之能夠更好的運行於硬件主板。

問題描述:

     運行./ltib –m config 就出錯了

   提示沒安裝zlib,其實系統已經安裝了,也已是最新版本。

解決方法:

  Zlib是提供數據壓縮用的函式庫, 對自己的程序和文件進行程序內數據壓縮、解壓

  添加路徑,打開目錄/ltib/bin/Ltibutils.pm 文件,search for zlib部分代碼;

  zlib         => sub { my @f = (glob('/usr/lib/libz.so*'),                                    

            glob('/lib/libz.so*'),                                    

            glob('/lib64/libz.so*'),+                                 

             glob('/lib/i386-linux-gnu/libz.so*'),                               

               glob('/usr/lib/i386-linux-gnu/libz.so*'),                                    

            glob('/usr/lib32/libz.so*'),                     

                      glob('/usr/lib/x86_64-linux-gnu/libz.so*') ); @f > 1 ? 1 : 0 },

 glob() 函數返回匹配指定模式的文件名或目錄。

加粗那一行錯誤所在,添加進去后才可以運行。

3.3、./ltib錯誤

問題描述:

You don't have a working TeX binary installed, but the texi2dvi script

can't proceed without it. If you want to use this script, you have to

install some kind of TeX, for example TeX Live Debian packages. You can do

that with this command:

       apt-get install texlive

make[2]: *** [flex.pdf] Error 1

make[2]: Leaving directory `/opt/freescale/ltib/usr/src/rpm/BUILD/flex-2.5.37/doc'

make[1]: *** [install-recursive] Error 1

make[1]: Leaving directory `/opt/freescale/ltib/usr/src/rpm/BUILD/flex-2.5.37'

make: *** [install] Error 2

error: Bad exit status from /home/cody/i.mx6/ltib/tmp/rpm-tmp.99407 (%install)

RPM build errors:

    Bad exit status from /home/cody/i.mx6/ltib/tmp/rpm-tmp.99407 (%install)

Build time for flex: 27 seconds

Failed building flex

Died at ./ltib line 1392.

traceback:

 main::build_host_rpms:1392

  main::host_checks:1447

   main:554

解決方案:

sudo apt-get install texinfo
sudo apt-get install texlive

原因:

tex 是一個排版系統

texlive就是包含了編輯器、編譯器、閱讀器的一個tex套裝;

texinfo軟件依賴於bash,包含讀取、寫入和轉換 Info 文檔的程序,以提供系統文檔

3.4、找不到文件目錄

問題描述:

 bash:command not found

 因為PATH變量的設置,導致系統原有的默認路徑被覆蓋,此時 sudo ,ls ,chmod等命令都不能用。

 解決方案:

  1,/usr/bin/sudo  vi  /etc/profile          (由於你找不到sudo,所以必須寫全路徑,其他命令如果提示找不到,也需要寫全路徑)

  2.末尾添加以下內容后保存 

       export PATH=$PATH:/sbin:/usr/bin:/usr/sbin

  /sbin一般是指超級用戶指令,主要放置一些系統管理的必備程式;

   /usr/bin 是你在后期安裝的一些軟件的運行腳本;

  /usr/sbin   放置一些用戶安裝的系統管理的必備程式;

     要考慮root 的$PATH里是否已經包含了這些環境變量。

     可以查看PATH,如果是:PATH=$PATH:$HOME/bin則需要添加成如下:

     PATH=$PATH:$HOME/bin:/sbin:/usr/bin:/usr/sbin

    3.重新啟動系統或執行以下命令生效

       source /etc/profile

 

  以上感謝小妍是師妹的整理和分享,這讓我們大家又多學了一點東西。以后決定將周會的內容記錄下來,分享和總結。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM