鏈接器的意義
鏈接器的主要作用是把各模塊之間相互引用的部分處理好,使得各模塊之間能夠正確的銜接
模塊鏈接
靜態鏈接
-由鏈接器在鏈接時將庫的內容直接加入到可執行程序中
Linux下靜態庫的創建和使用
-編譯靜態庫源碼:gcc -c lib.c -o lib.o
-生成靜態庫文件:ar -q lib.a lib.o //將 lib.o 與其他文件打包到 lib.a 中
-使用靜態庫編譯:gcc main.c lib.a -o main.out
動態鏈接
-可執行程序在運行時才動態加載庫進行鏈接
-庫的內容不會進入可執行程序當中
Linux下動態庫的創建和使用
-編譯動態庫源碼:gcc -shared dlib.c -o dlib.so
-使用動態庫編譯:gcc main.c -ldl -o main.out
-關鍵系統調用
1.dlopen:打開動態庫文件
2.dlsym:查找動態庫中的函數並返回調用地址
3.dlclose:關閉動態庫文件
dlib.c庫
char* name() { return "Dynamic Lib"; } int add(int a, int b) { return a + b; }
test.c
#include <stdio.h> #include <dlfcn.h> int main() { //打開(加載)動態庫 void* pdlib = dlopen("./dlib.so", RTLD_LAZY); char* (*pname)();//函數指針 int (*padd)(int, int);//函數指針 if( pdlib != NULL ) { //查找函數地址 pname = dlsym(pdlib, "name"); padd = dlsym(pdlib, "add"); if( (pname != NULL) && (padd != NULL) ) { printf("Name: %s\n", pname()); printf("Result: %d\n", padd(2, 3)); } //關閉動態庫 dlclose(pdlib); } else { printf("Cannot open lib ...\n"); } return 0; }
小結
1.鏈接是指將目標文件最終鏈接爲可執行程序
2.根據鏈接方式的不同,鏈接過程可以分爲:
-靜態鏈接:目標文件直接鏈接進入可執行程序
-動態鏈接:在程序啓動後才動態加載目標文件