arm linux gcc編譯器測試

2021-09-06 12:11:18 字數 1872 閱讀 8629

1、#include <>與#include ""的區別

#include <>只在標準庫中搜尋標頭檔案,而#include ""首先在使用者工作目錄(指的是當前被編譯原始檔所在目錄)搜尋,搜尋不到再到標準庫中搜尋標頭檔案(注意其他目錄是不會搜尋的)。也就是說#include ""搜尋的範圍比#include <>更大,但是#include <>雖然搜尋範圍小,但卻可以節省搜尋的時間。

當我們不使用系統標準庫檔案,而使用自定義的庫檔案,這時這個自定義的資料夾(是標頭檔案的資料夾)就替換了系統標準庫,成為#include <>搜尋的目錄。

乙個測試例子:

假設目錄test下有檔案test.c 、test.h 和兩個資料夾include 、lib。其中,test.c和test.h是使用者程式,而include、lib是使用者自定義的標準庫頭資料夾和源資料夾。test.c內容有這一句「#include "test.h"」,然後我們讓其編譯正常。這時再把test.h放到include中,我們會發現仍然編譯正常。

我們再修改test.c中這句話變成「#include 」,我們會發現仍然編譯正常(這時test.h在include資料夾下)。  我們把test.h再重新放回test目錄中,這時再編譯就會提示找不到標頭檔案test.h。

通過這個實驗,我們就會發現我一開始說的結論。

另外,還有一種常見的格式,以乙個例子說明。

#include ,這種情況只會搜尋標準庫目錄(include)中mcu目錄,其他目錄不會搜尋,包括標準庫目錄,也就是說這種情況只會搜尋標準庫目錄的子目錄。

#include "mcu/asm.h",這種情況不僅要搜尋標準庫目錄(inlcude)的子目錄mcu,還要搜尋使用者目錄的子目錄mcu,而且是首先從使用者目錄的子目錄mcu搜尋。

2、檔案在編譯過程中只需要函式被宣告,而不需要它完全被定義

乙個例子:main.c內容

#include 

"xx.h

"int main()

xx.h內容:

extern other_function(

void);

說明:我們在其他原始檔(.c)中定義了other_function()函式的原型,但是並沒有定義wait()函式的原型。

測試:我們編譯會發現會出現警告資訊,說「找不到wait()函式的宣告」,但是也能通過編譯。

修改:xx.h

extern other_function(

void);

extern wait(

void);

測試:這時,我們再編譯就會發現,連警告資訊都沒有了。

說明:顯然兩種情況都沒有定義wait()函式的原型,所以在程式連線的時候會報錯「找不到wait標號」。

當然,如果在其他檔案中定義了wait()函式,就能連線成功。

我的目的:我試圖在找尋編譯過程中,各個環節都是怎樣工作的。

3、編譯和鏈結做什麼樣的工作

試想編譯過程中就不考慮函式是否被定義,而只要宣告了就能無警告資訊的通過編譯。說明編譯過程中,主要是對本原始檔(.c)中程式進行編譯,而對於

外部呼叫的函式,實際上是鏈結步驟才考慮的事。

需要說明的是,乙個原始檔(.c 、.s)經過編譯後**基本上已經確定,位置無關**就是經過鏈結步驟也不會改變,位置有關**才是鏈結器解決的問題。

鏈結步驟,會根據檔案的lds檔案鏈結程式。將每個檔案的各個段按照lds檔案的規定排放起來(這裡我們不考慮載入位址),然後再根據外部函式的標號查詢各個段,然後確定位置有關**。當然,倘若在這裡邊沒有定義乙個段,但是卻宣告並使用了乙個段,顯然鏈結的時候會出現「找不到段」的錯誤。

可以說,標頭檔案主要就是外部介面的描述,把需要共享(外部呼叫)的段宣告出來。我認為標頭檔案在鏈結步驟中已經沒有任何作用。

交叉編譯器arm linux gcc

一 交叉編譯器簡介 在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的 這個編譯過程就叫交叉編譯.簡單地說,就是在乙個平台上生成另乙個平台上的可執行 二 體系結構與作業系統 1 常見的體系結構有arm結構 x86結構等.2 常見的作業系統有linux,windows等.3 同乙個體系結...

交叉編譯器arm linux gcc

一 交叉編譯器簡介 在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的 這個編譯過程就叫交叉編譯.簡單地說,就是在乙個平台上生成另乙個平台上的可執行 二 體系結構與作業系統 1 常見的體系結構有arm結構 x86結構等.2 常見的作業系統有linux,windows等.3 同乙個體系結...

交叉編譯器arm linux gcc

一 交叉編譯器簡介 在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的 這個編譯過程就叫交叉編譯.簡單地說,就是在乙個平台上生成另乙個平台上的可執行 二 體系結構與作業系統 1 常見的體系結構有arm結構 x86結構等.2 常見的作業系統有linux,windows等.3 同乙個體系結...