--事物的難度遠遠低于對事物的恐懼!
在上節,我們分析了編譯過程,編譯完成後得到目标檔案,而此時的目标檔案并不能馬上執行,還需要最後一步:連結。
首先來思考一個問題:工程中的每個C語言源檔案被編譯後生成的目标檔案,這些目标檔案如何生成最終的可執行程式?
這就需要這節我們将要分析連結器。
連結器:
連結器的主要作用是把各個子產品之間互相引用的部分處理好,使得各個子產品之間能夠正确的銜接。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9UEVNJzZE10dFp3Y0hnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMxkTMzYzM2ETMyQDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
連結又分為靜态連結和動态連結
靜态連結:
-由連結器在連結時将庫中的内容直接加入到可執行程式中
-優點:可執行程式的執行可脫離庫檔案直接運作
-缺點:每次軟體的更新,都需要重新編譯連結整個工程
linux下建立和使用靜态連結庫的步驟如下:
-編譯靜态庫源碼:gcc -c lib.c -o lib.o
-生成靜态庫檔案:ar -q lib.a lib.o
-使用靜态庫編譯:gcc main.c lib.a -o main.out
動态連結:
-可執行程式在運作時才動态加載庫進行連結
-庫的内容不會進入可執行程式中
優點:軟體更新時隻需要單獨編譯動态庫源檔案,并将生成的動态庫替換掉原來的動态庫即可,不需要重新編譯整個工程
缺點:因為是運作時才動态加載庫,所執行效率會比靜态連結低些
Linux下動态庫的建立和使用
-編譯動态庫源碼:gcc -share dlib.c -o dlib.so
-使用動态庫編譯:gcc main.c -ldl -o main.out
-關鍵系統調用
-dlopen:打開動态庫檔案
-dlsym:查找動态庫中的函數并傳回調用位址
-dlclose:關閉動态庫檔案
總結:
1、連結是指将目标檔案最終連結為可執行程式
2、根據連結方式不同,連結過程可以分為:
-靜态連結:目标檔案直接連結進入可執行程式
-動态連結:在程式啟動後才動态加載目标檔案(工程中推薦的方式)