溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

將靜態(tài)庫制作成動(dòng)態(tài)庫

發(fā)布時(shí)間:2020-06-25 18:41:38 來源:網(wǎng)絡(luò) 閱讀:946 作者:happytree007 欄目:開發(fā)技術(shù)

一、系統(tǒng)說明

    Ubuntu12.04TLS 64位


二、制作靜態(tài)庫

    (1)編寫需要制作成靜態(tài)庫的程序(根據(jù)實(shí)際情況進(jìn)行編寫,這里只是一個(gè)簡單例子)

    //bar.h    
    
    #ifndef _BAR_H
    #define _BAR_H
    
    void bar(int i);
    
    #endif

    

    //bar.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "bar.h"
    
    void bar(int i)
    {
        printf("Hello! I'm bar, i=%d\n", i);
    }

       

    //foo.h
    #ifndef _FOO_H
    #define _FOO_H
    
    void foo(int i);
    
    #endif

        

    //foo.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "foo.h"
    
    void foo(int i)
    {
        printf("Hello! I'm foo, i=%d\n", i);
    }

    (2)制作成靜態(tài)庫

    gcc -fPIC -c foo.c bar.c 
    ar rcs libstaticlib.a foo.o bar.o

        編譯生成foo.o 和 bar.o, 最終生成libstaticlib.a

        其中最重要的一個(gè)是 -fPIC 參數(shù),如果沒有這個(gè)參數(shù),如果是32位系統(tǒng)在制作動(dòng)態(tài)庫的時(shí)候沒有問題,但是64位的系統(tǒng)就有問題,制作動(dòng)態(tài)庫的時(shí)候?qū)?/p>

        報(bào)錯(cuò):

        /usr/bin/ld: foo.o: relocation R_X86_64_32 against `.rodata' can not be used when                 making a shared object; recompile with -fPIC
        foo.o: could not read symbols: Bad value
        collect2: ld 返回 1

        因此將靜態(tài)庫制作成64位機(jī)器上的動(dòng)態(tài)庫,必須使用-fPIC參數(shù)


     (3)簡單測(cè)試

    //main.c
    #include <stdio.h>    
    #include <stdlib.h>
    #include "foo.h"
    #include "bar.h"
    
    int main()
    {
        int i = 9;
        int j = 8;
    
        foo(i);
        bar(j);
    
        return 0;
    }

    

    gcc main.c -o test -L. -lstaticlib
    ./test

           結(jié)果:

            Hello! I'm foo, i=9
            Hello! I'm bar, i=8

三、用靜態(tài)庫制作成動(dòng)態(tài)庫

    (1)將上一步得到的靜態(tài)庫解壓,獲得目標(biāo)文件

    ar -x libstaticlib.a

        將獲得目標(biāo)文件foo.o 和 bar.o  

     (2)將目標(biāo)文件制作成動(dòng)態(tài)庫 

    gcc -fPIC -shared -o libsharedlib.so foo.o bar.o

          生成動(dòng)態(tài)庫 libsharedlib.so

      (3)將動(dòng)態(tài)庫路徑鍵入到加載路徑下

    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

            這樣做只是暫時(shí)的,終端關(guān)閉就失效了,想永久生效,修改配置文件   

        (3)簡單測(cè)試

        

    gcc main.c -o test -lsharedlib
    ./test

        結(jié)果:

              Hello! I'm foo, i=9
              Hello! I'm bar, i=8


四、總結(jié)

    (1)-fPIC 參數(shù)不僅在制作動(dòng)態(tài)庫的時(shí)候使用,當(dāng)將靜態(tài)庫制作到64位機(jī)器上的動(dòng)態(tài)庫時(shí),編譯靜態(tài)庫時(shí)要使用這個(gè)參數(shù)

    (2)動(dòng)態(tài)庫需要制動(dòng)加載的路徑,因此需要配置加載路徑

    (3)動(dòng)態(tài)庫與靜態(tài)庫的一些優(yōu)缺點(diǎn)

        內(nèi)存中每一個(gè)程序都會(huì)有一個(gè)代碼的拷貝,而動(dòng)態(tài)庫在內(nèi)存中只有一份

        靜態(tài)庫編譯的程序可以直接移植到其他地方運(yùn)行,而動(dòng)態(tài)庫的程序?qū)⒁蛘也坏芥溄訋鞂⒉荒軋?zhí)行

        靜態(tài)庫編譯的程序大小很大

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI