一,編譯(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 的庫文件。