C語言學習筆記--動態庫和靜態庫的使用


1.C語言中的鏈接器

 

1)每個 C 語言源文件被編譯后生成目標文件,這些目標文件最終要被鏈接在一起生成可執行文件。 

2)鏈接器的主要作用是把各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確的銜接。 

2.靜態鏈接

由鏈接器在鏈接時將庫的內容直接加入到可執行程序中

 

編譯靜態庫源碼: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

3.動態鏈接

可執行程序在運行時才動態加載庫進行鏈接 ,庫的內容不會進入可執行程序當中

 

編譯動態庫源碼:gcc –shared dlib.c –o dlib.so

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

 

4.dlopen、dlsym、dlclose使用動態庫

為了使程序方便擴展,具備通用性,可以采用插件形式。采用異步事件驅動模型,保證主程序邏輯不變,將各個業務已動態鏈接庫的形式加載進來,這就是所謂的插件。linux提供了加載和處理動態鏈接庫的系統調用,非常方便。 

打開動態庫:dlopen

查找動態庫中的函數並返回調用地址:dlsym 

關閉動態庫: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;
}

gcc -shared dlib.c -o dlib.so

gcc test.c -o test.o -ldl

 

 

參考資料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM