架構師交叉編譯
1. 如果想學linux,應該怎麼學
學嵌入式Linux要先學以下幾點:
1.C語言。要有C語言的基礎,當然越熟練越好,不熟也沒關系,具備基本技能就可以:比如寫一個數組排序、輸入數字求和什麼的。C語言的學習就是多些多練。
2.Linux基礎
Linux操作系統的概念、安裝方法,詳細了解Linux下的目錄結構、基本命令、編輯器VI ,編譯器GCC,調試器GDB和 Make 項目管理工具, Shell、 Makefile腳本編寫等知識,嵌入式開發環境的搭建。
3.Linux系統編程
重點學習標准I/O庫,Linux多任務編程中的多進程和多線程,以及進程間通信(pipe、FIFO、消息隊列、共享內存、signal、信號量等),同步與互斥對共享資源訪問控制等重要知識,主要提升對Linux應用開發的理解和代碼調試的能力。
4.Linux網路編程
計算機網路在嵌入式Linux系統應用開發過程中使用非常廣泛,通過Linux網路發展、TCP/IP協議、socket編程、TCP網路編程、UDP網路編程、Web編程開發等方面入手,全面了解Linux網路應用程序開發。重點學習網路編程相關API,熟練掌握TCP協議伺服器的編程方法和並發伺服器的實現,了解HTTP協議及其實現方法,熟悉UDP廣播、多播的原理及編程方法,掌握混合C/S架構網路通信系統的設計,熟悉HTML,Javascript等Web編程技術及實現方法。
5.數據結構與演算法
數據結構及演算法在嵌入式底層驅動、通信協議、及各種引擎開發中會得到大量應用,對其掌握的好壞直接影響程序的效率、簡潔及健壯性。此階段的學習要重點理解數據結構與演算法的基礎內容,包括順序表、鏈表、隊列、棧、樹、圖、哈希表、各種查找排序演算法等應用及其C語言實現過程。
6.Cortex A8 、Linux 平台開發
通過基於ARM Cortex-A8處理s5pv210了解晶元手冊的基本閱讀技巧,掌握s5pv210系統資源、時鍾控制器、電源管理、異常中斷控制器、nand flash控制器等模塊,為底層平台搭建做好准備。Linux平台包括內核裁減、內核移植、交叉編譯、GNU工具使用、內核調試、Bootloader介紹、製作與原理分析、根文件系統製作以及向內核中添加自己的模塊,並在s5pv210實驗平台上運行自己製作的Linux系統,集成部署Linux系統整個流程。同時了解Android操作系統開發流程。Android系統是基於Linux平台的開源操作系統,該平台由操作系統、中間件、用戶界面和應用軟體組成,是首個為移動終端打造的真正開放和完整的移動軟體,目前它的應用不再局限於移動終端,還包括數據電視、機頂盒、PDA等消費類電子產品。
7.驅動開發
驅動程序設計是嵌入式Linux開發工作中重要的一部分,也是比較困難的一部分。本階段的學習要熟悉Linux的內核機制、驅動程序與用戶級應用程序的介面,掌握系統對設備的並發操作。熟悉所開發硬體的工作原理,具備ARM硬體介面的基礎知識,熟悉ARM Cortex-A8處理器s5pv210各資源、掌握Linux設備驅動原理框架,熟悉工程中常見Linux高級字元設備、塊設備、網路設備、USB設備等驅動開發,在工作中能獨立勝任底層驅動開發。
2. 嵌入式開發培訓都有哪些內容
職業專家介紹,目前培養嵌入式人才的主要通過兩種途徑:一種是高校開設嵌入式專業課程,另一種是通過專業的嵌入式培訓機構培養企業所需的人才。本課程是為了適應目前發展迅速的嵌入式linux需求而設計,課程目標是讓學員達到適應嵌入式應用軟體開發、嵌入式系統開發或嵌入式驅動開發的基本素質。課程循序漸進的帶領你進入嵌入式開發的世界,採用了目前應用最廣泛的軟硬體開發平台(Linux和Arm),可以保證你盡量貼近目前企業的需求。 嵌入式培訓課程內容: 第一階段:嵌入式C高級編程 1.嵌入式C語言高級編程 2.嵌入式C語言經典數據結構及演算法編程 3.項目實戰(一)《lrc歌詞解析器》 在嵌入式領域中大部分開發都會用到C語言。C語言簡潔、緊湊、使用方便靈活加上GNU在實際項目開發中所做的擴展,使得C語言在整個嵌入式開發過程中起著至關重要的作用。更重要的是用C語言開發的程序在嵌入式平台下可移植性比較強。一個精通C語言程序設計的程序員,可以很容易地從事Linux、WinCE、Vxworks、μc/os等嵌入式操作系統下的軟體開發工作。本階段學習目標是掌握C語言基本知識、鞏固C編程語法基礎,以及深入C語言高級編程和數據結構與演算法,為將來的程序設計工作打下堅實的基礎。 第二階段:Linux應用及系統編程 1.Linux操作系統應用開發 2.嵌入式Linux高級系統編程 3.嵌入式資料庫--SQLite 4.項目實戰(二)《Mplayer播放器》 5.Linux網路編程 6.項目實戰(三)《基於Linux的信息交換系統》 7.C++及基於QT的GUI開發 8.項目實戰(四)《網路游戲對戰平台》 嵌入式Linux應用開發和系統開發是嵌入式Linux中非常重要的一部分,也是企業人才需求最廣的一部分。本階段學習的主要目標是精通嵌入式Linux下的應用程序設計,熟練掌握嵌入式Linux的開發環境、常用Linux命令,精通Linux系統編程、網路編程、QT GUI編開發,熟練掌握整個嵌入式Linux項目開發流程,提升學員對Linux應用開發的能力。 第三階段:嵌入式Linux平台開發 1.ARM體系結構 原理分析及其移植 2.ARM處理器編程 原理分析及其移植 3.基於ARM裸機驅動開發 原理分析及其移植 4.嵌入式Bootloader 原理分析及其移植 5.自製嵌入式系統啟動代碼 (Bootloader) 6.嵌入式Linux內核工作原理 分析及其移植 7.Linux內核調試技術 8.嵌入式Linux根文件系統 組成分析及其製作 8.嵌入式Linux開源工程 源碼分析及其編程 9.項目實戰(五) 《Web應用開發技術》 本階段將使學員掌握從零開始搭建嵌入式Linux運行環境。首先通過基於ARM Cortex-A8處理器S5pv210了解晶元手冊的基本閱讀技巧,掌握S5pv210系統資源、時鍾控制器、電源管理、異常中斷控制器、nand flash控制器等模塊,為底層平台搭建做好准備。Linux平台包括內核裁減、內核移植、交叉編譯、GNU工具使用、內核調試、Bootloader介紹、製作與原理分析、根文件系統製作以及向內核中添加自己的模塊,並在s5pv210實驗平台上運行自己製作的Linux系統,集成部署Linux系統整個流程。同時了解Android操作系統開發流程。Android系統是基於Linux平台的開源操作系統,該平台由操作系統、中間件、用戶界面和應用軟體組成,是首個為移動終端打造的真正開放和完整的移動軟體,目前它的應用不再局限於移動終端,還包括數據電視、機頂盒、PDA等消費類電子產品。 第四階段:嵌入式微處理器及Linux設備驅動開發 1.ARM硬體介面原理 2.嵌入式Linux設備驅動開發 3.嵌入式Linux高級驅動程序設計 4.項目實戰(六) 《重力感應實戰系統》 驅動程序設計是嵌入式Linux開發工作中重要的一部分,也是比較困難的一部分。本階段課程讓學員熟悉Linux的內核機制、驅動程序與用戶級應用程序的介面,掌握系統對設備的並發操作。熟悉所開發硬體的工作原理,具備ARM硬體介面的基礎知識,熟悉ARM Cortex-A8處理器s5pv210各資源、掌握Linux設備驅動原理框架,熟悉工程中常見Linux高級字元設備、塊設備、網路設備、USB設備等驅動開發,在工作中能獨立勝任底層驅動開發。 相關標簽:嵌入式培訓、嵌入式學習、北京嵌入式培訓
3. 什麼是交叉編譯
簡單的說,如果你開發嵌入式,也就是製作小的帶MCU(CPU)的智能電子產品。你必須保證你在電腦上開發編譯出的代碼,在你的產品上也要能夠運行,這時就需要在你的電腦里安裝交叉編譯工具,實現上述功能。
4. 什麼是交叉編譯
在一個平台架構上,編譯另一個平台架構的可執行代碼,就是交叉編譯。
例如在x86架構的pc上編譯arm嵌入式設備的可執行程序。
交叉編譯是不得不用,
首先在目標設備的系統還沒引導起來的時候,編譯目標平台的引導程序,顯然只能交叉編譯。
還有因為目標設備往往能力太低,沒法安裝編譯器,或者勉強安裝了,也慢得像蝸牛。
5. 在Ubuntu的環境下怎麼交叉編譯grpc到cortex-a9架構
1、 解壓工具鏈壓縮包
$ cd ~
$ mkdir toolchain
$ cd toolchain
gcc-4.6.4.tar.xz拷貝到toolchain目錄下並解壓
$ tar xvf gcc-4.6.4.tar.xz
2、 環境變數的添加
修改文件/etc/bash.bashrc添加如下內容
export PATH=$PATH:/home/linux/toolchain/gcc-4.6.4/bin
重啟配置文件
$ source /etc/bash.bashrc
6. ubuntu下進行嵌入式C語言開發時,什麼叫交叉編譯為什麼要交叉編譯
交易編譯就是將文件編譯成目標機可執行的文件。
比如說:你在PC機上寫一個helloword,怎麼讓它到開發板上運行,開發板上的指令跟PC機不到,就需要用到交叉編譯工具,編譯成開發板上能識別的指令。
7. 交叉編譯環境包括哪些工具,它的作用是什麼
首先你要知道一個軟體可能需要在多個CPU架構的平台上運行,如ARM架構,X86架構等等。
假設你要開發一個軟體目標平台是ARM,那麼你可以選擇在PC上,即X86平台上進行開發,然後使用交叉編譯工具把軟體編譯成ARM架構版本,然後才能在ARM上運行,如果只是用一般的編譯工具鏈,那麼只能編譯在當前平台上運行。
至於編譯工具鏈有哪些,具體要看你的開發平台和目標平台,會對應不同的編譯工具。
8. ARM下面Valgrind如何才能夠交叉編譯通過
使用交叉編譯工具鏈,在編譯選項中指定具體的arm處理器架構
9. 32 位支持:使用 GCC 交叉編譯
如果你是一個開發者,要創建二進制軟體包,像一個 RPM、DEB、Flatpak 或 Snap 軟體包,你不得不為各種不同的目標平台編譯代碼。典型的編譯目標包括 32 位和 64 位的 x86 和 ARM。你可以在不同的物理或虛擬機器上完成你的構建,但這需要你為何幾個系統。作為代替,你可以使用 GNU 編譯器集合 ( GCC ) 來交叉編譯,在單一的構建機器上為幾個不同的 CPU 架構產生二進制文件。
假設你有一個想要交叉編譯的簡單的擲骰子 游戲 。在大多數系統上,以 C 語言來編寫這個相對簡單,出於給添加現實的復雜性的目的,我以 C++ 語言寫這個示例,所以程序依賴於一些不在 C 語言中東西 (具體來說就是 iostream)。
在你的系統上使用 g++ 命令編譯它:
然後,運行它來確認其工作:
你可以使用 file 命令來查看你剛剛生產的二進制文件的類型:
同樣重要,使用 ldd 命令來查看它鏈接哪些庫:
從這些測試中,你已經確認了兩件事:你剛剛運行的二進制文件是 64 位的,並且它鏈接的是 64 位庫。
這意味著,為實現 32 位交叉編譯,你必需告訴 g++ 來:
為編譯成 32 位二進制,你需要在你的系統上安裝 32 位的庫和頭文件。如果你運行一個純 64 位系統,那麼,你沒有 32 位的庫或頭文件,並且需要安裝一個基礎集合。最起碼,你需要 C 和 C++ 庫(glibc 和 libstdc++)以及 GCC 庫(libgcc)的 32 位版本。這些軟體包的名稱可能在每個發行版中不同。在 Slackware 系統上,一個純 64 位的帶有 32 位兼容的發行版,可以從 Alien BOB 提供的 multilib 軟體包中獲得。在 Fedora、CentOS 和 RHEL 系統上:
不管你正在使用什麼系統,你同樣必須安裝一些你工程使用的 32 位庫。例如,如果你在你的工程中包含 yaml-cpp,那麼,在編譯工程前,你必需安裝 yaml-cpp 的 32 位版本,或者,在很多系統上,安裝 yaml-cpp 的開發軟體包(例如,在 Fedora 系統上的 yaml-cpp-devel)。
一旦這些處理好了,編譯是相當簡單的:
-m32 標志告訴 GCC 以 32 位模式編譯。-march=i686 選項進一步定義來使用哪種最優化類型(參考 info gcc 了解選項列表)。-L 標志設置你希望 GCC 來鏈接的庫的路徑。對於 32 位來說通常是 /usr/lib,不過,這依賴於你的系統是如何設置的,它可以是 /usr/lib32,甚至 /opt/usr/lib,或者任何你知道存放你的 32 位庫的地方。
在代碼編譯後,查看你的構建的證據:
接著,當然, ldd ./dice32 也會指向你的 32 位庫。
在 64 位相同的處理器家族上允許 GCC 做出很多關於如何編譯代碼的假設來編譯 32 位軟體。如果你需要為完全不同的處理器編譯,你必需安裝適當的交叉構建實用程序。安裝哪種實用程序取決於你正在編譯的東西。這個過程比為相同的 CPU 家族編譯更復雜一點。
當你為相同處理器家族交叉編譯時,你可以期待找到與 32 位庫集的相同的 64 位庫集,因為你的 Linux 發行版是同時維護這二者的。當為一個完全不同的架構編譯時,你可能不得不窮追你的代碼所需要的庫。你需要的版本可能不在你的發行版的存儲庫中,因為你的發行版可能不為你的目標系統提供軟體包,或者它不在容易到達的位置提供所有的軟體包。如果你正在編譯的代碼是你寫的,那麼你可能非常清楚它的依賴關系是什麼,並清楚在哪裡找到它們。如果代碼是你下載的,並需要編譯,那麼你可能不熟悉它的要求。在這種情況下,研究正確編譯代碼需要什麼(它們通常被列在 README 或 INSTALL 文件中,當然也出現在源文件代碼自身之中),然後收集需要的組件。
例如,如果你需要為 ARM 編譯 C 代碼,你必須首先在 Fedora 或 RHEL 上安裝 gcc-arm-linux-gnu(32 位)或 gcc-aarch64-linux-gnu(64 位);或者,在 Ubuntu 上安裝 arm-linux-gnueabi-gcc 和 binutils-arm-linux-gnueabi。這提供你需要用來構建(至少)一個簡單的 C 程序的命令和庫。此外,你需要你的代碼使用的任何庫。你可以在慣常的位置(大多數系統上在 /usr/include)放置頭文件,或者,你可以放置它們在一個你選擇的目錄,並使用 -I 選項將 GCC 指向它。
當編譯時,不使用標準的 gcc 或 g++ 命令。作為代替,使用你安裝的 GCC 實用程序。例如:
驗證你構建的內容:
這是一個如何使用交叉編譯的簡單的示例。在真實的生活中,你的源文件代碼可能產生的不止於一個二進制文件。雖然你可以手動管理,在這裏手動管理可能不是好的正當理由。在我接下來的文章中,我將說明 GNU 自動工具,GNU 自動工具做了使你的代碼可移植的大部分工作。
via: https://opensource.com/article/19/7/cross-compiling-gcc
作者: Seth Kenlon 選題: lujun9972 譯者: robsean 校對: wxy
