1. 編譯單個文件成可執行文件函數
gcc hello.c 生成默認的可執行文件a.out
2. 編譯單個文件爲指定名字的可執行文件,使用-o選項指定文件名字優化
gcc -o test main.c 生成文件名爲test的可執行文件
3. 編譯單個源文件成目標文件spa
(1)使用-c選項生成目標文件
指針
gcc -c main.c 生成文件名爲main.o的目標文件
(2)使用-o選項指定目標文件名字調試
gcc -c -o test.o main.c 生成文件名爲test.o的目標文件
4. 同時編譯多個源文件成目標文件code
使用-c選項生成目標文件blog
gcc -c main.c print.c 同時生成 文件名爲main.o和print.o的目標文件
5. 將多個源文件編譯成一個可執行文件字符串
(1)使用-o選項指定可執行文件名,直接編譯源文件get
gcc -o test main.c print.c 生成文件名爲test的可執行文件
(2)先生成目標文件,再連接成能夠執行文件原型
gcc -c main.c print.c 生成多個目標文件 gcc -o test main.o print.o 連接多個目標文件,生成文件名爲test的可執行文件
6. 預編譯命令和生成彙編命令
(1)使用-E選項進行預編譯
gcc -E print.c 進行預編譯操做,結果顯示在屏幕上 gcc -o print.i -E print.c 進行預編譯操做,並生成文件名爲string.i的預編譯結果文件
(2)使用-S選項進行生成彙編
gcc -S print.c 生成文件名一致(print.s)的的彙編語言文件
gcc -o print.s -S print.c 生成文件名爲print.s的彙編語言文件
7. 建立靜態庫
(1)靜態庫是目標文件的集合,使用ar和-r選項將目標文件打包成庫,庫文件一般以「.a」爲後綴
ar -rcs libprint.a print.o 生成文件名爲libprint.a的靜態庫
ar -rcs libleo.a print.o string.o 生成文件名爲libleo.a的靜態庫,其中包含print和string的函數庫
注意:必須使用目標文件進行歸檔,若是直接使用源文件進行歸檔,在後續的編譯器連接時會失敗
(2)連接靜態庫
gcc -o test main.c libprint.a 生成文件名爲test的可執行文件
(3)使用-l選項和-L選項連接靜態庫
gcc -o test main.c -lprint 使用-l選項後,就不須要指定lib前綴和擴展名,並會在系統默認目錄下查找print函數庫,該連接可能失敗,由於默認系統庫下面沒有print函數庫,須要使用-L選項指定庫的操做路徑
gcc -o test main.c -L./ -lprint 在當前目錄下查找函數庫,若是須要查找多個目錄,能夠連續使用-L選項
gcc -o test main.c -L./ -L./lib/ -lprint -lstring 在多個目錄下查找庫
8. 建立動態庫
動態庫是程序在運行時候加載的庫
(1)使用-shared選項生成動態庫,使用-fPIC或者-fpic選項生成位置無關的代碼
gcc -shared -fPIC -o libleo.so print.c string.c 生成文件名爲libleo.so的動態庫
(2)連接動態庫
gcc -o test main.c -L./ -lleo 生成文件名爲test的可執行文件
(3)運行可執行文件
一般程序在執行的時候須要加載動態庫,動態庫必須在程序的搜索目錄下,不然會出現運行時錯誤。
添加搜索目錄的兩種辦法:
- 添加環境變量:export LD_LIBRARY_PATH=/home/leo/test $LD_LIBRARY_PATH;
- 使用ldconfig /home/leo/test命令,若是不帶參數,刷新目錄列表,只添加系統默認目錄;
(4)動態加載庫:
使用dlopen(),dlerror(),dlsym()和dlclose()等相關函數
打開動態庫:
原型 void* dlopen(const char* filename, int flag); void* phandler = dlopen("./libleo.so", RTLD_LAZY); 打開動態庫,並庫的指針
獲取函數指針:
原型 void* dlsym(void* handler, char* symbol); void* pfunc = dlsym(phandler, "print"); 其中pfunc爲函數指針
打印錯誤:
原型 char* dlerror(); char* perror = dlerror(); 其中perror爲錯誤信息字符串
關閉動態庫
原型 void dlclose(void* phandler); dlclose(phandler);
編譯可執行文件:
gcc -o test main.c libleo.so -ldl
gcc 經常使用的選項:
-I+dir:擴大頭文件的搜索目錄;
-L+dir:擴大連接庫的搜索目錄;
-static:使用靜態庫進行連接;
-g:包含調試信息;
-On:優化程序;
-Wall:打開全部警告信息;
-Werror:將全部警告信息當成錯誤消息來處理,並中斷編譯;
獲取最新的gcc版本:
apt-get install gcc