i.MX8MM處理器采用了先進的14LPCFinFET工藝,提供更快的速度和更高的電源效率;四核Cortex-A53,單核Cortex-M4,多達五個內核 ,主頻高達1.8GHz,2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT、4G模塊、CAN、RS485等接口一應俱全。H264、VP8視頻硬編碼,H.264、H.265、VP8、VP9視頻硬解碼,并提供相關歷程,支持8路PDM接口、5路SAI接口、2路Speaker。系統支持Android9.0(支持獲取root限)Linux4.14.78+Qt5.10.1、Yocto、Ubuntu20、Debian9系統。適用于智能充電樁,物聯網,工業控制,醫療,智能交通等,可用于任何通用工業和物聯網應用、
【公眾號】迅為電子
【粉絲群】258811263(加群獲取驅動文檔+例程)
第十六章 Linux 第一個程序 HelloWorld
本章內容對應視頻講解鏈接(在線觀看):
Linux 第一個程序 HelloWorld →?https://www.bilibili.com/video/BV1M7411m7wT?p=16
有過單片機或者ARM嵌入式開發經驗的小伙伴,都知道我們寫完一個程序之后,我們要對程序進行編譯,那么在單片機上有 keil 、IAR 這樣的集成環境供我們選擇,但是我們一旦進入了linux的世界,這些常見的就都不見蹤影了,一切都要從新開始。在 linux 上也就是 ubuntu 上我們編譯程序使用的是 gcc 。
16.1?gcc?基本使用
gcc 全稱(gnu compiler collection)即編譯套件,gcc 可以支持多種計算機體系結構,比如X86、 ARM 、MIPI .我們使用的ubuntu默認自帶的gcc。我們直接輸入以下命令:
gcc -v
gcc -v 功能:查看 gcc的版本。
我們打開 ubuntu ,寫一個 hello world ,現在處在家目錄的 test 文件夾, test 這個文件夾是作者自己創建的,我們自己做實驗的話,可以使用mkdir 命令創建一個文件夾,然后在這個文件夾里面做實驗。作者直接使用vi hello.c 創建一個文件并打開它。
# include <stdio.h>
int main(void)
{
????????printf(“hello world!\n”);
????????return 0;
}
然后我們編譯hello.c,命令格式:
gcc 選項 文件名
-o參數為指定生成文件的文件名
舉例: gcc hello.c -o hello
輸入“./hello” 運行 hello 文件, ./ 的意思是在當前目錄找到 hello 文件并執行。
如果我們不使用 -o 參數指定我們生成文件的名稱,直接輸入 gcc hello.c?編譯完會得到一個 a.out 文件,執行這個 a.out 的結構和執行hello 是一樣的。
file 命令:
功能:查看文件類型
格式: file 文件名
使用gcc 編譯器編譯出來的可執行文件是X86的,不能在 arm 開發板上運行。可以使用file 命令來查看文件類型。
16.2 編譯流程
從hello.c 編譯得到hello或者 a.out 要經歷四個步驟:預處理,編譯,匯編,鏈接。
hello.i ??預處理得到的C語言代碼
hello.s ??匯編語言文件
hello.o ??目標文件
第一階段:預處理階段,編譯器會對頭文件或者宏定義進行展開,或者條件編譯的選擇
我們可以使用 -E參數得到預處理文件
-E :只對文件進行預處理,不編譯和鏈接。
使用 gcc -E hello.c -o hello.i 得到預處理后的文件,輸入以下命令:
gcc -E hello.c -o hello.i
第二階段:編譯,把文件編譯成匯編代碼
-S參數 將hello.i 文件編譯成 hello.s 文件
第二階段:編譯,把文件編譯成匯編代碼
-S參數 將hello.i 文件編譯成 hello.s 文件
第三階段:匯編,把匯編文件編譯機器碼
-c 參數 可以把 hello.s 文件編譯成 hello.o文件
第四階段:鏈接
直接把目標文件編譯成可執行文件
鏈接分為靜態鏈接和動態鏈接,gcc默認的是動態鏈接
特點:生成的程序下,但是需要依賴庫,
靜態鏈接:使用 -static 參數就是靜態鏈接,因為程序里面包含了需要的庫,所以體積比較大。