一,編譯(compile)
含義:用編譯器(compile)將原始碼產生二進位目標檔案。在Window下為.obj。在Linux下為.o檔案。
要求:編譯器要求,文法正確。編譯器只檢測程式文法和函數、變數是否被聲明,函數並不許要被定義。
編譯文法:g++ -c file.cpp 其中-c 為compile產生 file.o的目標檔案
二,連結(link)
含義:將所有需要到函數所在的檔案愛你連結在一起合成為可執行檔。
文法:g++ file.o -o file.exe 其中-o 指產生可執行檔(output)。預設為a.out
【合并】g++ file.cpp -o file.exe
三,庫(library)
含義:對於一個源檔案很多的大項目,為了避免重複編譯,也為了方便編譯器連結,通常會把一些常用到的目標檔案打包(archive),於是就成為了傳說中的庫檔案(library)。在Windows下這種包叫“庫檔案”(Library File),也就是 .lib 檔案,在UNIX下,是Archive File,也就是 .a 檔案
文法: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)。
四, 在編譯時間連結庫
建立了自己的庫,以後要用到相關函數的時候,只需在代碼中聲明所要用的函數(必須和庫中定義得相同)。在連結的時候,需要給出庫的名稱和位置:
g++ file1.o file2.o -o program.exe -L**** -l****
-L 後緊跟庫檔案所在的目錄位址,-l 後緊跟庫名。
編譯器在連結的時候會在所指定的目錄位址下尋找名為 lib****.a 的庫檔案。