gcc基本語法格式:gcc [-選項] 源文件 [-選項] 目標文件,GCC編譯C程序的過程:
- 預處理:gcc -E hello.c hello.i。-E指定執行到預處理結束,下面類似。
- 編譯:gcc -S hello.i -o hello.S。
- 匯編:gcc -c hello.S -o hello.o。
- 鏈接:gcc hello.o -o hello。鏈接階段就需要涉及到函數庫了,舉例說明:要執行printf函數,我們都會#include <stdio.h>,但是預處理只能包含進stdio.h文件,也就是只有printf函數的聲明,而函數實現在函數庫libc.so.6中,雖然沒有特別指定這個庫,但是只要頭文件中有聲明,gcc會到系統默認搜索路徑"/usr/lib"下查找並鏈接函數庫,這樣才能執行printf函數。
函數庫有靜態庫和動態庫兩種,簡單來說,由.h和.c文件來生成函數庫,編譯后,就可以在其他.c文件中使用函數:
靜態庫的創建和使用:
- 將.h和.c文件匯編成目標文件:gcc -c libhello.c -o libhello.o。
- 將目標文件歸檔,封裝成庫:ar -rc libhello.a libhello.o。
- 在編譯過程中使用靜態庫:gcc usehello.c -o usehello_static libhello.a。然后就可以執行程序了。
動態庫的創建和使用:
- 匯編生成目標文件,和靜態庫一樣:gcc -c libhello.c。
- 編譯生成動態庫:gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so。
- 編譯程序和動態庫:gcc usehello.c -o usehello_dy -lhello -L ./ 。
- 執行時,也需要指明動態庫:LD_LIBRARY_PATH=$(pwd) ./usehello_dy 。
當然還可以統一函數庫版本的使用:
gcc -c libhello.c gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so.1.0 //即生成庫可能就會有多個版本 ln -s libhello.so.1.0 libhello.so //所以用一個軟鏈接來更新版本,對外卻統一顯示 gcc usehello.c -o usehello_dy -lhello -L ./ LD_LIBRARY_PATH=$(pwd) ./usehello_dy
如果在運行動態庫時,不想指明庫的路徑,則有兩種方法:
- 在/usr/lib或者/lib目錄下,存放動態庫或其鏈接。
- 在etc/ld.so.conf文件中,追加庫或者鏈接所在的路徑;然后退出保存,執行ldconfig命令使更改生效。
工程管理器make:
語法:系統默認自動變量:
$<第一個依賴文件、$@目標文件。
用戶自定義變量:變量=值——引用$(變量)。
將靜態庫用makefile完成,用make管理:
usehello_static: usehello.c libhello.a gcc $< -o $@ libhello.a libhello.a: libhello.o ar -rc $@ $< libhello.o: libhello.c gcc -c $< clean: rm usehello_static libhello.a libhello.o
動態庫:
usehello_dy: usehello.c libhello.so gcc $< -o $@ libhello.so -L ./ libhello.so: libhello.o gcc $< -shared -W1,-soname,libhello.so -o $@ libhello.o: libhello.c gcc -c $< clean: rm usehello_dy libhello.so libhello.o
在makefile里面寫lhello,它不認。
