NDK 靜態庫和動態庫原理以及編譯流程

2021-09-23 17:06:35 字數 2386 閱讀 1296

完成巨集替換、檔案引入、以及去除空行、注釋等,為下一步的編譯做準備。

也就是對各種預處理命令進行處理,包括標頭檔案的包含、巨集定義的擴充套件、條件編譯的選擇等。、

經過預處理後,檔案會變大很多。

# test.c 檔案記憶體

#include

int main()

通過以下命令進行預處理

gcc -e test.c -o test.i

-e: 讓gcc在預處理結束後停止編譯,"test.i" 檔案為預處理後輸中的檔案

-o : 指定輸出檔案

預處理前, test.c 70bytes, 預處理後 test.i 17.9kb

將預處理後的**編譯成彙編**。在這個階段中,首先要檢查**的規範性、是否有語法錯誤等,已確定**實際要做的工作,在檢查無誤後,再把**翻譯成組合語言。

編譯程式執行時,先分析,後綜合。分析,就是指此法分析、語法分析、語義分析和中間**生成。綜合,就是指**優化和**生成。

大多數的編譯程式直接產生機器語言的目標**,形成可執行的目標檔案,也有的是先產生組合語言一級的符號**檔案,再呼叫匯程式設計序進行 翻譯和加工處理,最後產生可執行的機器語言目標檔案。

通過以下命令進行編譯

gcc -s test.i -o test.s

-s:讓gcc在編譯結束後停止編譯過程,"test.s"檔案為編譯後生成的彙編**。

彙編就是把編譯階段生成的 ".s" 檔案轉成二進位制目標**,也就是機器**(01序列)

通過以下命令進行彙編

gcc -c test.s -o test.o

-c : 讓gcc在彙編結束後停止編譯過程 , "test.o" 檔案為彙編後生成的機器碼目標檔案。

鏈結就是將多個目標檔案以及所需的庫檔案鏈結生成可執行目標檔案的過程。

通過以下命令進行鏈結

gcc test.o -o test

./ test

-o: 本質上是乙個重新命名選項。不使用 -o 選項時,預設生成的是a.out 檔案。這裡生成的是可執行檔案test。

./text 執行後輸出 hell world

靜態庫實際就是一些目標檔案(一般以.o結尾)的集合,靜態庫一般以.a結尾,只用於生成可執行檔案階段。

在鏈結步驟中,聯結器將從庫檔案取得的所有**,複製到生成的可執行檔案中。這種庫稱為靜態庫。其特點是可執行檔案中包含了庫**的乙份完整的拷貝,在編譯過程中被引導程式中。缺點是多次使用就會有多份冗餘拷貝,並且對程式的更新、部署、和發布帶來麻煩,如果靜態庫更新,那麼多有使用它的程式都需要重新編譯、發布。

生成靜態庫:

#首先生成目標檔案

gcc -c test.c -o test.o

#使用ar命令將目標檔案打包成靜態庫

ar rcs libtest.a test.o

ar:creating libtest.a

#使用ar t libtest.a 檢視靜態庫內容

ar t libtest.a

test.o

首先生成test.o目標檔案

使用ar命令將test.o 打包成libtest.a 靜態庫

#使用靜態庫

#  -l 指定鏈結庫  -l 編譯程式按目錄尋找庫檔案

gcc -o main main.c -l. -ltool

#檢視可執行檔案依賴了哪些庫

ldd main

動態庫在鏈結階段沒有被複製到程式中,而是在程式執行時,由系統動態載入到記憶體中提供程式使用。

系統中只需要載入一次動態庫,不同的程式可以得到記憶體中相同的動態庫的副本,因此節省了很多記憶體。

生成動態庫

#生成目標檔案

gcc -c test.c -o test.o

#使用 -fpic 和 -shared生成動態庫

gcc -shared -fpic -o libtest.so test.o

首先生成test.o目標檔案。

使用 -shared 和 -fpic 引數生成動態庫

# 鏈結動態庫

# 和鏈結靜態庫的命令一樣, 當存在相同名字的靜態庫和動態庫時,優先載入動態庫

gcc -o main main.c -l. -ltool  

# 執行可執行檔案 

# 不能直接 ./main ,會報錯,找不到庫檔案

# 需要指定動態庫,設定環境變數, 需要將動態庫 tool所在目錄,設定到環境變數中

ld_library_path = ../main

載入時刻不同:

靜態庫在程式編譯時會鏈結到目標檔案中,程式執行時不再需要靜態庫,因此體積比較大。而且每次編譯都需要載入靜態**,記憶體記憶體開銷他。

動態庫在程式編譯時不會被鏈結到目標**中,而是程式執行時才被載入,程式執行時需要動態庫存在,因此體積比較小。而且系統中只需要載入一次動態庫,不同程式可以得到記憶體中相同的動態庫副本,因此記憶體開銷小。

NDK 編譯和使用靜態庫 動態庫

ndk 編譯和使用靜態庫 動態庫 情況一 編譯靜態庫 情況二 編譯動態庫 情況三 編譯動態庫 靜態庫 情況四 已有第三方靜態庫 動態庫 編譯靜態庫 動態庫 預設所有 和檔案在 project jni下,否則特殊說明。情況一 編譯靜態庫 檔案android.mk local path call my ...

庫(靜態庫和動態庫)

一 靜態庫 以c語言的形式生成庫 h中extern c int add int int extern c int sub int int 二.測試靜態庫 將.h和.lib放入 h ifdef cplusplus c 程式設計師用c的方式開啟 extern c int add int int exte...

靜態庫和動態庫

一。靜態庫 靜態庫的優點在於使用簡單,編譯快速。靜態庫在應用程式生成時,已經編譯成為可重定位的目標檔案,因此可以不必再編譯,節省編譯時間,以最短的時間生成可執行程式。步奏 a。建立靜態庫 1 在編輯器中編輯其靜態庫函式 static lib.c 2 在shell中編譯該原始檔,生成乙個可重定位的目標...