欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言圖文并茂詳解鏈接過程

 更新時(shí)間:2022年04月19日 11:57:09   作者:清風(fēng)自在 流水潺潺  
首先來思考一個(gè)問題:工程中的每個(gè)C語言源文件被編譯后生成的目標(biāo)文件,這些目標(biāo)文件如何生成最終的可執(zhí)行程序? 這就需要這節(jié)我們將要分析的鏈接器

一、鏈接器的意義

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

二、模塊鏈接

靜態(tài)鏈接

由鏈接器在鏈接時(shí)將庫的內(nèi)容直接加入到可執(zhí)行程序中

Linux下靜態(tài)庫的創(chuàng)建和使用

  • 編譯靜態(tài)庫源碼:gcc -c lib.c -o lib.o
  • 生成靜態(tài)庫文件:ar -q lib.a lib.o
  • 使用靜態(tài)庫編譯:gcc main.c lib.a -o main.out

下面看一段靜態(tài)鏈接示例的代碼:

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,編譯靜態(tài)庫源碼:

輸入ar -q slib.a slib.o,生成靜態(tài)庫文件:

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

然后輸入 ./Test.out,就可以運(yùn)行了,如下:

如果把 slib.o,slib.a 文件全部刪除,運(yùn)行 ./Test.out,發(fā)現(xiàn)能正常運(yùn)行,這就是前面說的 .o 文件和 .a 文件完全被鏈接進(jìn)了可執(zhí)行程序里面,可執(zhí)行程序的運(yùn)行跟 .o 文件和 .a 文件沒有任何關(guān)系。

動(dòng)態(tài)鏈接

  • 可執(zhí)行程序在運(yùn)行時(shí)才動(dòng)態(tài)加載庫進(jìn)行鏈接
  • 庫的內(nèi)容不會進(jìn)入可執(zhí)行程序當(dāng)中

Linux下動(dòng)態(tài)庫的創(chuàng)建和使用

編譯動(dòng)態(tài)庫源碼:gcc -shared dlib.c -o dlib.so

使用動(dòng)態(tài)庫編譯:gcc main.c -ldl -o main.out

關(guān)鍵系統(tǒng)調(diào)用

  • dlopen:打開動(dòng)態(tài)庫文件
  • dlsym:查找動(dòng)態(tài)庫中的函數(shù)并返回調(diào)用地址.
  • dlclose:關(guān)閉動(dòng)態(tài)庫文件

下面看一個(gè)動(dòng)態(tài)鏈接示例:

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,編譯動(dòng)態(tài)庫源碼:

再輸入gcc Demo.c -ldl -o Demo.out,使用動(dòng)態(tài)庫編譯,生成 .out 文件:

然后輸入 ./Demo.out,就可以運(yùn)行了,如下:

如果把 dlib.so 給刪了,運(yùn)行就會報(bào)錯(cuò):

所以dlib.so 這個(gè)庫文件是在程序的運(yùn)行階段被動(dòng)態(tài)加載到內(nèi)存中去,這就是與靜態(tài)鏈接的區(qū)別。

三、小結(jié)

鏈接是指將目標(biāo)文件最終鏈接為可執(zhí)行程序

根據(jù)鏈接方式的不同,鏈接過程可以分為:

  • 靜態(tài)鏈接:目標(biāo)文件直接鏈接進(jìn)入可執(zhí)行程序
  • 動(dòng)態(tài)鏈接:在程序啟動(dòng)后才動(dòng)態(tài)加載目標(biāo)文件

到此這篇關(guān)于C語言圖文并茂詳解鏈接過程的文章就介紹到這了,更多相關(guān)C語言 鏈接過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++ 移動(dòng)構(gòu)造相關(guān)總結(jié)

    c++ 移動(dòng)構(gòu)造相關(guān)總結(jié)

    這篇文章主要介紹了c++ 移動(dòng)構(gòu)造的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • 深入了解C語言棧的創(chuàng)建

    深入了解C語言棧的創(chuàng)建

    棧只允許在一端進(jìn)行插入或刪除操作的線性表。首先棧是一種線性表,但是限定這種線性表只能在某一端進(jìn)行插入和刪除操作,這篇文章主要介紹了C語言對棧的實(shí)現(xiàn)基本操作
    2021-07-07
  • 淺析C++元組tuple類型

    淺析C++元組tuple類型

    元組tuple是C++的一個(gè)模板,不同tuple類型的成員類型也不相同,但是一個(gè)tuple可以有任意數(shù)量的成員,今天通過本文給大家介紹C++元組tuple類型,感興趣的朋友一起看看吧
    2022-06-06
  • Qt實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼

    Qt實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼

    下面小編就為大家分享一篇Qt實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • C語言大廠面試技巧及strcpy()函數(shù)示例詳解

    C語言大廠面試技巧及strcpy()函數(shù)示例詳解

    這篇文章主要為大家介紹了C語言面試技巧,以strcpy()函數(shù)為示例進(jìn)行分析詳解,有需要沖刺大廠的朋友們可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Qt中JSON操作的具體使用

    Qt中JSON操作的具體使用

    本文主要介紹了Qt中JSON操作的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C語言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))

    C語言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))

    持久數(shù)據(jù)其實(shí)就是將數(shù)據(jù)保存到數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于C語言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • C++ 頭文件系列(set)詳解

    C++ 頭文件系列(set)詳解

    一般而言,每個(gè)C++/C程序通常由頭文件和定義文件組成。頭文件作為一種包含功能函數(shù)、數(shù)據(jù)接口聲明的載體文件,主要用于保存程序的聲明,而定義文件用于保存程序的實(shí)現(xiàn) 。
    2017-02-02
  • C語言函數(shù)的基本使用和遞歸詳解

    C語言函數(shù)的基本使用和遞歸詳解

    一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層
    2021-09-09
  • C語言實(shí)現(xiàn)食堂就餐管理系統(tǒng)(帶鏈表)

    C語言實(shí)現(xiàn)食堂就餐管理系統(tǒng)(帶鏈表)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)食堂就餐管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論