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 同乙個體系結...