1. 程式人生 > >自己製作靜態/動態連結庫並使用

自己製作靜態/動態連結庫並使用

  • 靜態連結庫 

    #vi mylib.c    //編輯庫函式定義原始碼

#include <stdio.h>

void printfHello(void)
{
    printf("Hello mylib\n");
}

int Max(int a,int b)             //不知道為什麼在這裡加行內函數符連結時會報錯
{
    return ((a>b)? a:b);
}

  #vi Makefile   //編寫makefile檔案

all:
    gcc mylib.c -o mylib.o -c    //只編譯不連結
    ar  -rc libmylib.a mylib.o   //建立.a歸檔檔案

  # make  

  #ls

mylib.c  mylib.o  libmylib.a 

  #vi mylib.h    //編寫庫函式宣告標頭檔案

void printfHello(void);
int Max(int a,int b);

  #vi test.c     //編寫測試程式

#include <stdio.h>
#include "mylib.h"

int main(void)
{
    int a=2,b=3;
    int c=0;
    printfHello();
    c=Max(a,b);
    printf("%d\n",c);
    return 0;
}

  #gcc test.c -o test -lmylib -L.      //-L.當前檔案下查詢庫檔案

  •  動態連結庫

    #vi Makefile   //編寫makefile檔案

all:
    gcc mylib.c -o mylib.o -c -fPIC      //只編譯不連結
    gcc -o libmylib.so mylib.o -shared   //建立.so動態庫檔案
   
   //-fPIC是置位無關碼,-shareed是按照共享庫方式連結

  動態連結庫執行時需要被載入,系統去固定目錄嘗試載入libmylib.so,需要將libmylib.so與這個固定目錄關聯,可以直接cp到

  這個目錄下,但是這種方法不是最好

  解決方法:使用環境變數LD_LIBRARY_PATH,作業系統在載入固定目錄/user/lib目錄之前回去LD_LIBRARY_PATH環境

  變數所指定的目錄下去尋找。

  •   將動態庫所在目錄匯出到LD_LIBRARY_PATH中

         #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chen/C/mylibrary/libtest

成功後可直接執行./test檔案

  •  補充:

         ldd命令檢視程式引用了哪些共享庫,是否解析成功。