從邏輯功能上看,程式的主體是由一系列函式組成的,所以編寫程式的主要工作之一是實現函式。為了有效降低程式設計的工作量,程式設計系統會把一些非常基本、常用的函式集中到函式庫中實現,如資訊的列印函式、檔案的開啟或者關閉函式、記憶體空間的申請與釋放函式、數學計算函式等。當程式需要使用函式庫中某個函式時,就可以直接從庫中呼叫。
函式庫中的使用方式分為靜態鏈結和動態鏈結兩種。靜態鏈結是指編譯系統在鏈結階段把程式的目標檔案和所需的函式庫檔案鏈結在一起,這樣生成的可執行檔案就可以在沒有函式庫的情況下執行。就好比火箭把燃料和氧料裝在一起,這樣在沒有空氣的太空中國也可以飛行。動態鏈結庫是指編譯系統在鏈結階段並不把目標檔案和函式庫檔案鏈結在一起,而是等到程式在執行過程中需要的時候才會鏈結到函式庫。
靜態鏈結和動態鏈結的特點:
使用靜態鏈結方式產生的可執行檔案體積大,但是執行效率高。
使用動態鏈結方式產生的可執行檔案由於沒有庫檔案,所以體積小,但是執行中由於要動態載入函式庫,所以執行效率要低一點。
在具體應用時,如果有多個原始檔要呼叫函式庫,那麼應該選擇動態鏈結方式。而只有少數原始檔需要呼叫函式庫的時候,應該選擇靜態鏈結的方式。可以被靜態鏈結的函式庫被稱為靜態庫,可以被動態鏈結的函式庫被稱為動態庫,或者共享庫。
在linux系統中,其中/lib目錄中的函式庫檔案主要是給/bin目錄下的的系統程式使用的,/usr/bin目錄中的函式庫檔案主要是給/usr目錄下的使用者程式使用的。
其中,字尾為a的是靜態庫檔案,字尾為la的是用來記錄庫檔案資訊的動態庫檔案,字尾為so的是動態庫檔案。
編寫hello.c f1.c f2.c(f1.c 和 f2.c 是hello.c中呼叫的兩個子函式)
把f1.c f2.c 彙編處理,變成二進位制檔案
gcc -c f1.c f2.c
自動生成f1.o f2.o
把二進位制檔案做成靜態庫
ar -crv libxx.a f1.o f2.0
靜態庫命名方法 lib + 庫名 + .a
編譯hello.c檔案
gcc hello.c -o hello -static -l . -l xx
static 表示採用靜態編譯
-l 表示靜態庫的路徑(後面跟著路徑)
-l 表示庫的名字(不要加.a字尾了)
gcc -fpic -shared f1.c f2.c -o lib***.so
編譯原始檔
gcc hello.c -o hello -l . -l ***
因為上文講了載入動態庫需要去lib目錄下去查詢,所以要將lib***.so檔案拷貝到/usr/lib目錄下再執行
cp lib***.so /usr/lib
Linux c程式設計之gdb的使用
gdb是在linux的控制台視窗下的乙個除錯工具,功能十分強大,今天些簡單的學習一下關於gdb的基本使用 首先,用gcc編譯程式時需要加上 g引數以便獲取除錯資訊 首先要使用gdb除錯程式,在用gcc編譯時要加上 g引數,否則gdb會提示缺少除錯資訊。如下圖 因此,需要使用如下方法編譯程式 gcc ...
Linux C程式設計之 makefile使用
一,示例 四個檔案 main.c main.h t print.c t print.h makefile 寫法1 main main.o t print.o gcc main.o t print.o o main main.o main.c main.h gcc c main.c t print.o...
linux c 程式設計
linux下為了安全性不能雙擊執行控制台程式,只有gui程式才能雙擊執行.linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於...