首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,這個(gè)動(dòng)作叫做編譯(compile)。然后再把大量的Object File合成執(zhí)行文件,這個(gè)動(dòng)作叫作鏈接(link)。
編譯時(shí),編譯器需要的是語(yǔ)法的正確,函數(shù)與變量的聲明的正確。對(duì)于后者,通常是你需要告訴編譯器頭文件的所在位置(頭文件中應(yīng)該只是聲明,而定義應(yīng)該放在C/C++文件中),只要所有的語(yǔ)法正確,編譯器就可以編譯出中間目標(biāo)文件。一般來(lái)說(shuō),每個(gè)源文件都應(yīng)該對(duì)應(yīng)于一個(gè)中間目標(biāo)文件(O文件或是OBJ文件)。
鏈接時(shí),主要是鏈接函數(shù)和全局變量,所以,我們可以使用這些中間目標(biāo)文件(O文件或是OBJ文件)來(lái)鏈接我們的應(yīng)用程序。鏈接器并不管函數(shù)所在的源文件,只管函數(shù)的中間目標(biāo)文件(Object File),在大多數(shù)時(shí)候,由于源文件太多,編譯生成的中間目標(biāo)文件太多,而在鏈接時(shí)需要明顯地指出中間目標(biāo)文件名,這對(duì)于編譯很不方便,所以,我們要給中間目標(biāo)文件打個(gè)包,在Windows下這種包叫“庫(kù)文件”(Library
File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
總結(jié)一下,源文件首先會(huì)生成中間目標(biāo)文件,再由中間目標(biāo)文件生成執(zhí)行文件。在編譯時(shí),編譯器只檢測(cè)程序語(yǔ)法,和函數(shù)、變量是否被聲明。如果函數(shù)未被聲明,編譯器會(huì)給出一個(gè)警告,但可以生成Object
File。而在鏈接程序時(shí),鏈接器會(huì)在所有的Object File中找尋函數(shù)的實(shí)現(xiàn),如果找不到,那到就會(huì)報(bào)鏈接錯(cuò)誤碼(Linker
Error),在VC下,這種錯(cuò)誤一般是:Link 2001錯(cuò)誤,意思說(shuō)是說(shuō),鏈接器未能找到函數(shù)的實(shí)現(xiàn)。你需要指定函數(shù)的ObjectFile.
1 將main.c預(yù)處理、匯編、編譯、鏈接形成可執(zhí)行文件。
gcc main.c -o main.o
選項(xiàng): -c
只激活預(yù)處理,編譯,和匯編,也就是他只把程序做成obj文件
例子用法:
gcc -c hello.c
他將生成.o的obj文件。與gcc -c hello.c -o hello.o效果相同
2 編譯成so庫(kù)
g++ src.cpp -fPIC -shared -o libsrc.so
同時(shí)編譯多個(gè)cpp文件如:
g++ *.cpp -shared -fPIC -o libSip.so
3 忽略-Wwrite-strings告警
遇到該類(lèi)告警想忽略時(shí)增加:-Wno-write-strings
即:g++ *.cpp -shared -fpic -Wno-write-strings -o sip.so
4.出現(xiàn)undefined reference to錯(cuò)誤時(shí),如截圖,
undefined reference to `dlopen'
undefined?reference?to?`dlerror'
undefined reference to `dlsym'
1.dlopen函數(shù)時(shí)引用自#include <dlfcn.h>中的,是C的庫(kù)文件,因此c++調(diào)用這些定義的函數(shù)時(shí),需要加上extern "C"。用來(lái)告知編譯器:這是一個(gè)用C寫(xiě)成的庫(kù)文件,請(qǐng)用C的方式連接他們。
2.如果不加extern "C",在編譯的時(shí)候需要加 -ldl參數(shù)。(Link "dl" library)
如:g++ testSip.cpp -ldl -o test.o
編譯過(guò)程:
gcc/g++在執(zhí)行編譯工作的時(shí)候,總共需要4步
1.預(yù)處理,生成.i的文件
預(yù)處理器cpp
2.將預(yù)處理后的文件不轉(zhuǎn)換成匯編語(yǔ)言,生成文件.s
編譯器egcs
3.有匯編變?yōu)槟繕?biāo)代碼(機(jī)器代碼)生成.o的文件
匯編器as
4.連接目標(biāo)代碼,生成可執(zhí)行程序
連接器ld
首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,這個(gè)動(dòng)作叫做編譯(compile)。然后再把大量的Object File合成執(zhí)行文件,這個(gè)動(dòng)作叫作鏈接(link)。