天天看點

C語言中連結過程簡介

--事物的難度遠遠低于對事物的恐懼! 

    在上節,我們分析了編譯過程,編譯完成後得到目标檔案,而此時的目标檔案并不能馬上執行,還需要最後一步:連結。

    首先來思考一個問題:工程中的每個C語言源檔案被編譯後生成的目标檔案,這些目标檔案如何生成最終的可執行程式?

這就需要這節我們将要分析連結器。

    連結器:

    連結器的主要作用是把各個子產品之間互相引用的部分處理好,使得各個子產品之間能夠正确的銜接。

C語言中連結過程簡介

連結又分為靜态連結和動态連結

靜态連結:

    -由連結器在連結時将庫中的内容直接加入到可執行程式中

        -優點:可執行程式的執行可脫離庫檔案直接運作

        -缺點:每次軟體的更新,都需要重新編譯連結整個工程

C語言中連結過程簡介

    linux下建立和使用靜态連結庫的步驟如下:

        -編譯靜态庫源碼:gcc -c lib.c -o lib.o

        -生成靜态庫檔案:ar -q lib.a lib.o

        -使用靜态庫編譯:gcc main.c lib.a -o main.out

動态連結:

    -可執行程式在運作時才動态加載庫進行連結

    -庫的内容不會進入可執行程式中

    優點:軟體更新時隻需要單獨編譯動态庫源檔案,并将生成的動态庫替換掉原來的動态庫即可,不需要重新編譯整個工程

    缺點:因為是運作時才動态加載庫,所執行效率會比靜态連結低些

C語言中連結過程簡介

Linux下動态庫的建立和使用

    -編譯動态庫源碼:gcc -share dlib.c -o dlib.so

    -使用動态庫編譯:gcc main.c -ldl -o main.out

    -關鍵系統調用

        -dlopen:打開動态庫檔案

        -dlsym:查找動态庫中的函數并傳回調用位址

        -dlclose:關閉動态庫檔案

總結:

    1、連結是指将目标檔案最終連結為可執行程式

    2、根據連結方式不同,連結過程可以分為:

        -靜态連結:目标檔案直接連結進入可執行程式

        -動态連結:在程式啟動後才動态加載目标檔案(工程中推薦的方式)

繼續閱讀