嵌入式Linux開發工具 編譯器gcc以及庫的製作

2021-10-19 05:36:01 字數 1980 閱讀 6401

是什麼?

為什麼?(嵌入式硬體受限於成本)

怎麼做?(畫個餅 )

(編譯命令的各種字尾)

-c:			//對原始檔進行編譯或彙編

-e: //對原始檔進行預處理

-s: //對原始檔進行編譯

-o file: //輸出目標檔案file

-w: //遮蔽所有的警告資訊

-wall: //顯示所有型別的警告資訊

-o0123 : //零、一、二、**優化

-idir: //指定標頭檔案的搜尋目錄dir

-ldir: //指定搜尋目錄dir

存放函式和變數的倉庫;

特點:只能使用庫里函式和變數,不能看到其實現(例如:printf strcpy)

靜態庫和動態庫的區別(可執行檔案的區別)

可執行檔案的大小:靜態庫 > 動態庫(記憶體的使用效率)

可執行檔案的速度:靜態庫 > 動態庫(執行效率)

可執行檔案的功能公升級:靜態庫 < 動態庫(功能公升級的難易度)

可執行檔案**部署:靜態庫 > 動態庫(**位置的部署)

庫檔案的存放路徑: /lib/ /usr/lib

如何製作靜態庫和動態庫

gcc -o *.o -c *.c (原始檔)

ar rcs lib*(庫檔名).a *(目標檔案1).o *(目標檔案2).o

gcc 原始檔 -l庫名 -l庫的路徑

例項:用vim建立乙個靜態庫,庫中包含4個函式,分別為加、減、乘、除,源程式檔案取名為static_lib.c

編譯"static_lib.c"成靜態庫"static_lib.a vim static_lib.c"

- 建立原始檔 gcc -c static_lib.c

- 編譯原始檔使它生成乙個可重定位的目標檔案 *.o ar rcs static_lib.a static_lib.o

- 用ar工具生成靜態庫,引數r表示把列表中目標檔案加入到靜態庫中;引數c表示若指定靜態庫不存在則建立該庫;引數s表示更新靜態庫檔案索引使其包含新加入的目標檔案內容;再ls檢視目錄,有發現生成了static_lib.a static_lib.a static_lib.c static_lib.o即為建立成功

用vim建立乙個標頭檔案,使應用程式可以正確引用該庫中的全域性符號,標頭檔案原始檔命名為static_lib.h

用vim建立乙個應用程式並命名為main.c,該程式實現功能很簡單:接受使用者輸入兩個數,呼叫static_lib.a庫中的函式進行加減乘除。

#include

#include

"static_lib.h"

intmain()

5、編譯應用程式

.

/main //執行程式

please input a and b:

//提示輸入

1111

//輸入兩個數

the add :

22//執行結果

the sub :

0the mul :

121the div :

1

「undefined reference error」錯誤的原因可能來自以下幾方面:

沒有指定對應的庫(.o/.a/.so)

連線庫引數的順序不對

gcc/ld 版本不匹配

gcc/ld的版本的相容性問題,由於gcc2 到 gcc3大版本的相容性存在問題(其實gcc3.2到3.4也一定程度上存在這樣的問題)

當在高版本機器上使用低版本的機器就會導致這樣的錯誤,

這個問題比較常見在32位的環境上,另外就在32位環境不小心使用了64位的庫或者反過來64位環境使用了32位的庫。

c/c++相互依賴和鏈結

執行期報錯

動態庫製作:(未完成學習)

嵌入式Linux開發工具

3.工程管理器 make make工程管理器也就是個 自動編譯管理器 自動 指它能夠根據檔案的時間戳自動發現更新過的檔案而減少檔案的編譯量,同時,它通過讀取makefile檔案來執行大量編譯 工作。makefile是make讀入的唯一配置檔案!makefile格式 target dependency...

嵌入式開發工具

嵌入式linux開發工具 vim,gcc.gdb,make vim 文字編輯器 學會使用和如何配置vim gcc 編譯器 學會製作動態庫和靜態庫及使用與區別 gdb 偵錯程式 設定斷點 單步執行 除錯記憶體錯誤 make 工程管理器 編寫makefile檔案 linux文字編輯器 vim 功能最強大...

嵌入式Linux開發工具(二)

隸屬於gnu計畫的工具 核心除錯kgdb 程式的錯誤分類 編譯時錯誤 語法錯誤 邏輯問題 記憶體錯誤 segmentation fault core dumped gdb的功能 執行程式 設定斷點 檢視變數值 下面展示一些gdb語法hello.c gcc g hello.c o hello gdb ...