鴻蒙系統編譯第一個APP:hello

2020-09-19 14:00:34

第三章 編譯第一個APP:hello

1.1 Clang、LLVM與GCC介紹

我們在Ubuntu中給PC機編譯程式時,執行這樣的命令:

gcc  -o  hello   hello.c

我們在Ubuntu給ARM板編譯程式時,執行這樣的命令(gcc字首可能不一樣):

arm-linux-gcc  -o  hello   hello.c

在Liteos-a中,使用LLVM來編譯程式。LLVM的本意是「Low Level Virtual Machine」,一個底層的虛擬機器器。但是它現在已經發展成了一種編譯器(compiler)的框架系統。簡單地說,LLVM可以取代GCC,LLVM容易擴充套件,可以提供更好的效能。

LLVM的框架如下:
在這裡插入圖片描述
Clang是「Frontend」(前端),用來執行詞法分析、語法分析,簡單地說就是:檢查語法錯誤、包含標頭檔案、擴充套件宏。

中間是優化器,把前端分析好的程式碼轉換為LLVM IR(中間表示,intermediate representation),IR與機器無關,可以很方便地新增一系列的優化。

優化後得到的IR,再由「Backend」(後端)轉換為各種機器的機器碼。

以上內容來自網路,我對Clang、LLVM理解不深,簡單介紹一下而已。

1.2 編譯hello程式

使用Clang時,我們要指定很多引數:為哪類CPU編譯程式(ARM還是Risc-V),CPU架構是什麼(cortex A7還是cortex A15),標頭檔案/庫檔案在哪?

在為Liteos-a編譯程式時,以hello程式為例,可以執行以下命令:

cd  /home/book/openharmony_for_imx6ull/apps/hello
clang -target arm-liteos   --sysroot=/home/book/openharmony/prebuilts/lite/sysroot/  \
   -o  hello   hello.c

上述命令的sysroot引數中,指定有標準標頭檔案、庫檔案的目錄。

還可以像GCC一樣使用「-I」、「-L」引數指定其他標頭檔案的目錄、庫檔案的目錄,比如後面會編譯這個程式:

cd  /home/book/openharmony_for_imx6ull/apps/freetype
clang -target arm-liteos   --sysroot=/home/book/openharmony/prebuilts/lite/sysroot/  \
-I /home/book/openharmony/third_party/freetype/include \
-L /home/book/openharmony/out/ipcamera_hi3518ev300/libs/usr  \
-lfreetype \
-o show_line show_line.c

1.3 把hello程式放入rootfs

編譯出hello程式後,可以把它放入rootfs目錄下的bin字母,比如:

cd  /home/book/openharmony_for_imx6ull/apps/hello
cp  hello  /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/bin

然後重新制作rootfs.jffs2,執行以下命令:

> cd  /home/book/openharmony/kernel/liteos_a/out/imx6ull/ mkfs.jffs2  -s
> 0x10000 -e 0x10000 -d rootfs -o rootfs.jffs2

假設hello程式位於/home/book/apps/hello目錄下,操作截圖如下:
在這裡插入圖片描述

把得到的rootfs.jffs2放到燒寫工具的files目錄,就可以使用燒寫工具啟動了:
在這裡插入圖片描述
進入命令列後,就可以執行hello程式了,如下圖所示:
在這裡插入圖片描述
注意:必須用「./bin/hello」,不能用絕對路徑「/bin/hello」

全文下載
技術交流群(鴻蒙開發/Linux/嵌入式/驅動/資料下載)
QQ群:869222007