一、靜態(tài)鏈接
靜態(tài)鏈接通過靜態(tài)庫進行鏈接,生成的目標程序中包含運行需要的所有庫,可以直接運行,不過就是文件比較大。靜態(tài)庫是匯編產(chǎn)生的.o文件的集合,一般以.a文件形式出現(xiàn)。gcc在使用靜態(tài)鏈接的時候需要加上-static參數(shù)。
二、動態(tài)鏈接
動態(tài)鏈接使用動態(tài)鏈接庫進行鏈接,生成的程序在執(zhí)行的時候需要加載所需要的動態(tài)庫才能運行,動態(tài)鏈接程序輕便,但必須依賴動態(tài)庫。Linux下的動態(tài)鏈接庫實際上是共享目標文件,一般是以.so文件形式存在。GCC默認是動態(tài)鏈接不需要加參數(shù)。
舉例子看一下動態(tài)鏈接庫的使用方法,創(chuàng)建三個C語言文件:mymath.c、mymath.h、test.c。
通過兩個變量相加的方式來舉例說明。
mymath.h添加內(nèi)容如下:
#ifndef __MYMATH_H_
#define __MYMATH_h_ #include<stdio.h> extern int add(int a,int b); #endif |
mymath.c添加內(nèi)容如下:
#include "mymath.h"
int add(int a,int b) { return a+b; } |
最后來一個測試文件 test.c(在這里需要注意的一個小細節(jié),調(diào)用自己寫的.h文件時,必須使用雙引號,“xxxx.h”):
#include<stdio.h>
#include"mymath.h" void main() { printf("2+3=%dn",add(2,3)); } |
然后進行編譯,因為test引用了mymath.h,所以不能單獨編譯,gcc test.c mymath.c一起進行,否則就會報錯。(如下編譯正確)
接下來是生成動態(tài)鏈接庫的方法,gcc -shared xx -o xxx.so,當我們使用cat去進行查看的時候會發(fā)現(xiàn),so文件里全是亂碼,這就是使用動態(tài)鏈接庫的一個好處,可以防止核心算法的泄露。
現(xiàn)在就可以將mymath.c刪除掉了:
直接調(diào)用庫編譯發(fā)現(xiàn)程序不能運行。
下面將我們自己建立的庫移動到/usr/lib目錄下試試,然后發(fā)現(xiàn)代碼運行成功。
可以在Linux系統(tǒng)下自己嘗試下。