gcc:編譯器 業界最流行的編譯器就是gcc,然後是微軟的masm.mac已經預設安裝了gcc、g++的編譯器。 gdb:調試器。
一、gcc編譯器: c 程式:使用gcc或g++編譯器編譯。c程式字尾為:.c c++程式:使用g++編譯器編譯。c++程式字尾為:
一個編譯過程包括下面幾個階段: (1)預處理:預處理器将對源檔案中的宏進行展開。 (2)編 譯:gcc将c檔案編譯成 彙編檔案。 (3)彙 編:as将彙編檔案編譯成機器碼。 (4)鍊 接:将目标檔案和外部符号進行連接配接,得到一個可執行二進制檔案。
步驟1:寫代碼:test.c 步驟2:預編譯:gcc -E test.c -o test.i //vim test.i 可以看到預編譯已經把.h拷貝進去了,define X 2 也全部替換掉了。 步驟3:編 譯:gcc -S test.i -o test.s //生成的test.s是彙編語言。 步驟4:彙 編: as test.s -o test.o //将彙編代碼翻譯成二進制,生成目标檔案.o不可執行。通過file可看到該檔案位置還沒有定下來。 步驟5:鍊 接:gcc test.o -o test //生成可執行檔案test。./test可以執行。
一步生成目 标檔案:gcc -c test.c //後面省略了-o test.o 。可以使用nm指令檢視test.o檔案。 一步生成可執行檔案:gcc test.c -o test //這時生成的就是可執行檔案。可以任何檔案直接-o成最後的可執行檔案。 如果不寫-o test,會預設生成a.out gcc test1.c test2.c test3.c -o main //一次編多個檔案的情況
gcc -v //顯示gcc版本
-c 生成 .o檔案,隻編譯不連結 -o 輸出目标檔案,制定輸出檔案名 -g 加上之後會把自己的代碼跟調試資訊對應起來,可執行程式包含調試資訊
二、動态庫、靜态庫 靜态庫:lib***.a 動态庫:lib***.o
靜态庫:靜态庫少之又少。當把靜态庫拷給使用者之後,别人不需要庫就能執行。也就是不依賴于中間層。缺點就是生成的二進制太大了。可能拷貝了很多無用的接口。每一個可執行檔案都包含庫。 動态庫:在程式連結時并不會被連結到目标代碼中,而是在程式運作時才被載入。 好處就是:當有多個可執行檔案時。共享一個庫。 壞處就是:當程式拿到别的機器上運作時,需要調試。需要看看庫是不是有,版本是不是對。 工作當中一般都是動态庫。
系統預設動态庫:/lib /lib64 /usr/lib /usr/local/ 一般自己寫的庫放在/usr/lib下
如何編寫動态庫: 步驟一:vim add.c int add(int a,int b){ return a+b; } 步驟二: gcc -fPIC -Wall -c add.c //-o add.o 可以省略。因為-c 預設生成同名的.o檔案。 步驟三: gcc add.o -shared -o libadd.so //這時就生成了動态庫:libadd.so 步驟四: cp -rp libadd.so /lib //最簡單的就是拷貝到lib下面,這樣其他程式就可以使用了。 步驟五:vim test.c #include <stdio.h> void main(int argc,char* argv[]){ if(argc!=3){ printf("argc error"); return; } int i=atoi(argv[1]); int j=atoi(argv[2]); printf("sum=%d\n", add(i,j)); } 步驟六:gcc test.c -o main -ladd //要顯示地寫出自己寫的庫。-l***表示連結庫。 或步驟六:
env看環境變量。裡面的PATH能看到自動搜尋的路徑。 echo $LD_LIBRARY_PATH export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/luke //在環境變量中增加路徑,在該路徑下存放動态庫 如何編寫靜态庫:(工作中都不用,一般隻寫動态庫) 步驟一:vim add.c //同動态庫步驟一。 步驟二:gcc -c add.c //省略了-o add.o 步驟三:ar crsv libadd.a add.o //生成了靜态庫:libadd.a 步驟四:rm /lib/libadd.so //拷靜态庫之前先把add的動态庫删了。 cp libadd.a /lib //同動态庫步驟四。 步驟五:開始使用,vim test.c //同動态庫步驟五。 步驟六:gcc main.c -o main -ladd //同動态庫步驟六。