g 編譯和鏈結

2021-06-06 00:56:23 字數 1586 閱讀 5047

1.編譯(compile):指用編譯器(compiler)將源**(source code)生成二進位制目標檔案(object file),在windows下也就是 .obj 檔案,unix下是 .o 檔案。編譯時,編譯器需要的是語法的正確,函式與變數的宣告的正確,編譯器只檢測程式語法,和函式、變數是否被宣告,函式並不需要被定義。

unix下g++的語法為:

g++ -c file.cpp

-c 是compile的意思,此命令將會生成 file.o 的目標檔案。

2.鏈結(link):找到所要用到函式所在的目標檔案,並把它們鏈結在一起合成為可執行檔案(executable file)。鏈結時,要確保編譯器能找到所有被用到了的函式所在的目標檔案。

g++ file1.o file2.o -o program.exe

-o 是指定生成的可執行檔名稱(output)。若不給出,預設的名稱為 a.out

上述兩部通常也可以合在一起完成:

g++ file1.cpp file2.cpp -o program.exe

這完全等同於上面兩步的結合,會先生成目標檔案,然後鏈結成 file.exe

3. 庫 (library)

對於乙個原始檔很多的大專案,為了避免重複編譯,也為了方便編譯器鏈結,通常會把一些常用到的目標檔案打包(archive),於是就成為了傳說中的庫檔案(library)。在windows下這種包叫「庫檔案」(library file),也就是 .lib 檔案,在unix下,是archive file,也就是 .a 檔案。

unix 所要用到的命令:

1)ar -- create, modify, and extract from archives.

@usage: ar cr lib****.a file1.o file2.o

**** 為自定義的庫檔名。

標籤 c (create):如果庫不存在,則建立庫;

標籤 r (replace):如果庫中已存在要新增的物件檔案,則舊的物件檔案將被替換。

實際上 ar 只是乙個打包工具,是archive(打包)的首字母。它將一系列的目標檔案首位連線在一起,並內嵌乙個索引表,使得編譯器能夠方便地找到所需要的函式。一般來說,由於函式索引表的存在,對庫的鏈結要比對一般的物件檔案的鏈結更快。如果 ar 未能完成此項索引表工作,還可以手動用以下的 ranlib 命令建立索引表。

2) ranlib -- generate index to archive.

@usage: ranlib lib****.a

3) nm -- list symbols from object files.

nm可以用來顯示 ranlib 所構建的索引表。你將會看到所有庫里的函式名(除了模板函式template function)。

4. 在編譯時鏈結庫

建立了自己的庫,以後要用到相關函式的時候,只需在**中宣告所要用的函式(必須和庫中定義得相同)。在鏈結的時候,需要給出庫的名稱和位置:

g++ file1.o file2.o -o program.exe -l**** -l****

-l 後緊跟庫檔案所在的目錄位址,-l 後緊跟庫名。

編譯器在鏈結的時候會在所指定的目錄位址下尋找名為 lib****.a 的庫檔案。

編譯和鏈結

一般來說,無論是c c 首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file,這個動作叫做編譯 compile 然後再把大量的object file合成執行檔案,這個動作叫作鏈結 link 編譯時,編譯器需要的是語法的正確,函式與...

編譯和鏈結

在多道程式的實現中,要想使原始檔生成可執行檔案通常需要兩個步驟編譯和鏈結,其中編譯是指將原始檔編譯為中間 檔案,在linux中為 o檔案,其實質就是由c或c 等高階語言生成組合語言。生成可執行檔案,我們以編譯c c 為例,在windows中編譯生成的為.obj檔案,在linux unix中生成.o檔...

編譯和鏈結

平時,我們口頭上並不嚴格區分 編譯 compile 與 鏈結 link 這兩個專業術語。例如我們總是說 把那個 c檔案編譯成可執行檔案 寫成命令就是 gcc example.c 這個命令馬上給我們產生乙個 a.out 如果程式沒有錯誤的話 實際上,整個工作至少要分成四個階段,分別由不同的程式完成 第...