linux下的gcc編譯器

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

相關文章
相關標籤/搜索