傳統(tǒng)意義上的編譯程序分兩步走 —— 編譯和鏈接:
1.編譯(compile):指用編譯器(compiler)將源代碼(source code)生成二進(jìn)制目標(biāo)文件(object file),在Windows下也就是 .obj 文件,UNIX下是 .o 文件。編譯時(shí),編譯器需要的是語(yǔ)法的正確,函數(shù)與變量的聲明的正確,編譯器只檢測(cè)程序語(yǔ)法,和函數(shù)、變量是否被聲明,函數(shù)并不需要被定義。
UNIX下g++的語(yǔ)法為:
g++ -c file.cpp
-c 是compile的意思,此命令將會(huì)生成 file.o 的目標(biāo)文件。
2.鏈接(link):找到所要用到函數(shù)所在的目標(biāo)文件,并把它們鏈接在一起合成為可執(zhí)行文件(executable file)。鏈接時(shí),要確保編譯器能找到所有被用到了的函數(shù)所在的目標(biāo)文件。
g++ file1.o file2.o -o program.exe
-o 是指定生成的可執(zhí)行文件名稱(chēng)(output)。若不給出,默認(rèn)的名稱(chēng)為 a.out
上述兩部通常也可以合在一起完成:
g++ file1.cpp file2.cpp -o program.exe
這完全等同于上面兩步的結(jié)合,會(huì)先生成目標(biāo)文件,然后鏈接成 file.exe
3. 庫(kù) (library)
對(duì)于一個(gè)源文件很多的大項(xiàng)目,為了避免重復(fù)編譯,也為了方便編譯器鏈接,通常會(huì)把一些常用到的目標(biāo)文件打包(archive),于是就成為了傳說(shuō)中的庫(kù)文件(library)。在Windows下這種包叫“庫(kù)文件”(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
**** 為自定義的庫(kù)文件名。
標(biāo)簽 c (create):如果庫(kù)不存在,則創(chuàng)建庫(kù);
標(biāo)簽 r (replace):如果庫(kù)中已存在要添加的對(duì)象文件,則舊的對(duì)象文件將被替換。
實(shí)際上 ar 只是一個(gè)打包工具,是archive(打包)的首字母。它將一系列的目標(biāo)文件首位連接在一起,并內(nèi)嵌一個(gè)索引表,使得編譯器能夠方便地找到所需要的函數(shù)。一般來(lái)說(shuō),由于函數(shù)索引表的存在,對(duì)庫(kù)的鏈接要比對(duì)一般的對(duì)象文件的鏈接更快。如果 ar 未能完成此項(xiàng)索引表工作,還可以手動(dòng)用以下的 ranlib 命令創(chuàng)建索引表。
2) ranlib -- generate index to archive.
@Usage: ranlib lib****.a
3) nm -- list symbols from object files.
nm可以用來(lái)顯示 ranlib 所構(gòu)建的索引表。你將會(huì)看到所有庫(kù)里的函數(shù)名(除了模板函數(shù)template function)。
4. 在編譯時(shí)鏈接庫(kù)
創(chuàng)建了自己的庫(kù),以后要用到相關(guān)函數(shù)的時(shí)候,只需在代碼中聲明所要用的函數(shù)(必須和庫(kù)中定義得相同)。在鏈接的時(shí)候,需要給出庫(kù)的名稱(chēng)和位置:
g++ file1.o file2.o -o program.exe -L**** -l****
-L 后緊跟庫(kù)文件所在的目錄地址,-l 后緊跟庫(kù)名。
編譯器在鏈接的時(shí)候會(huì)在所指定的目錄地址下尋找名為 lib****.a 的庫(kù)文件。
posted on 2010-04-29 13:31
李陽(yáng) 閱讀(25331)
評(píng)論(1) 編輯 收藏 引用