中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言鏈接的過程是什么

發布時間:2022-04-19 13:49:49 來源:億速云 閱讀:278 作者:iii 欄目:開發技術

這篇“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

下面看一段靜態鏈接示例的代碼:

slib.c

char* name()
{
    return "Static Lib";
}
 
int add(int a, int b)
{
    return a + b;
}

Test.c

#include <stdio.h>
 
extern char* name();
extern int add(int a, int b);
 
int main()
{
    printf("Name: %s\n", name());
 
    printf("Result: %d\n", add(2, 3));
 
    return 0;
 
}

輸入gcc -c slib.c -o slib.o,編譯靜態庫源碼:

C語言鏈接的過程是什么

輸入ar -q slib.a slib.o,生成靜態庫文件:

C語言鏈接的過程是什么

輸入gcc Test.c slib.a -o Test.out,使用靜態庫編譯,生成 .out 文件:

C語言鏈接的過程是什么

然后輸入 ./Test.out,就可以運行了,如下:

C語言鏈接的過程是什么

如果把 slib.o,slib.a 文件全部刪除,運行 ./Test.out,發現能正常運行,這就是前面說的 .o 文件和 .a 文件完全被鏈接進了可執行程序里面,可執行程序的運行跟 .o 文件和 .a 文件沒有任何關系。

動態鏈接

  • 可執行程序在運行時才動態加載庫進行鏈接

  • 庫的內容不會進入可執行程序當中

C語言鏈接的過程是什么

Linux下動態庫的創建和使用

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

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

關鍵系統調用

  • dlopen:打開動態庫文件

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

  • dlclose:關閉動態庫文件

下面看一個動態鏈接示例:

dlib.c

char* name()
{
    return "Dynamic Lib";
}
 
int add(int a, int b)
{
    return a + b;
}

Demo.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,編譯動態庫源碼:

C語言鏈接的過程是什么

再輸入gcc Demo.c -ldl -o Demo.out,使用動態庫編譯,生成 .out 文件:

C語言鏈接的過程是什么

然后輸入 ./Demo.out,就可以運行了,如下:

C語言鏈接的過程是什么

如果把 dlib.so 給刪了,運行就會報錯:

C語言鏈接的過程是什么

所以dlib.so 這個庫文件是在程序的運行階段被動態加載到內存中去,這就是與靜態鏈接的區別。

以上就是關于“C語言鏈接的過程是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尖扎县| 阜新市| 密山市| 广昌县| 嘉善县| 临潭县| 黄浦区| 波密县| 兴化市| 深圳市| 呼玛县| 九龙县| 高淳县| 上蔡县| 南部县| 辽宁省| 扶余县| 西林县| 子洲县| 石家庄市| 南京市| 习水县| 新宾| 纳雍县| 淅川县| 曲阜市| 灵宝市| 庆云县| 梨树县| 扶余县| 吉木萨尔县| 柞水县| 惠来县| 襄汾县| 西畴县| 广丰县| 中西区| 芦溪县| 梅河口市| 德阳市| 沽源县|