linux動態庫的編譯與使用

2021-05-21 17:30:56 字數 1641 閱讀 4475

linux下的動態庫以.so為字尾,我也是初次在linux下使用動態庫,寫一點入門步驟,以便以後能方便使用。

第一步:編寫linux程式庫

檔案1.動態庫介面檔案

//動態庫介面檔案getmaxlen.h

#ifndef _getmaxlen_h_

#define _getmaxlen_h_

int getmaxlen(int *sel,int n);

#endif

檔案2.動態庫程式實現檔案

//動態庫程式實現檔案getmaxlen.c

#include "getmaxlen.h"

int getmaxlen(int *sel,int n)

int n1=1,n2=1;

for(int i=1;iif(sel[i]>sel[i-1])

n2 ++;

if(n2 > n1)

n1 = n2;

else

n2 = 1;

return n1;

第二步:編譯生成動態庫

gcc getmaxlen.c –fpic –shared –o libtest.so

由以上命令生成動態庫libtest.so,為了不需要動態載入動態庫,在命令時需以lib開頭以.so為字尾。

–shared:指明編譯成動態庫。

第三步:使用動態庫

1.      編譯時使用動態庫

檔案1.動態庫使用檔案test.c

//使用動態庫libtest.so,該檔名為test.c

#include "getmaxlen.h"

int main()

int sel = ;

int m;

m = getmaxlen(sel,15);

printf("%d",m);

return 0;

編譯命令:

gcc test.c –l . –l test –o test

–l:指明動態庫所在的目錄

-l:指明動態庫的名稱,該名稱是處在頭lib和字尾.so中的名稱,如上動態庫libtest.so的l引數為-l test。

測試:ldd test

ldd 測試可執行檔案所使用的動態庫

2.      動態載入方式使用動態庫

檔案內容:

//動態庫的動態載入使用

int main()

void *handle = null;

int (*getmaxlen)(int *sel,int n);

int sel = ;

handle = dlopen("./libtest.so",rtld_lazy);

if(handle == null)

printf("dll loading error./n");

return 0;

getmaxlen = (int(*)(int *,int))dlsym(handle,"getmaxlen");

if(dlerror()!=null)

printf("fun load error./n");

return 0;

printf("%d/n",getmaxlen(sel,15));

編譯命令:

gcc –ldl test1.c –o test

linux 靜態庫與動態庫的編譯和使用

gcc o test.o test.c 將.c檔案編譯成.o ar xv libtest.a 靜態庫解包 ar rv libtest.a o 將.o檔案編譯成.a,用 o可以將所有.o檔案編譯成乙個.a gcc shared o test.so o 將.o檔案編譯成.so,用 o可以將所有.o檔案編...

linux下動態庫的編譯使用

linux下動態庫的編譯 1 實踐 test cl.c 1 include 2 include 3 4 extern int add int a,int b 5 define labeladdr 6 main 7 test so.c 1 int add int a,int b 2 test so1....

linux編譯動態庫與呼叫

動態庫是乙個包含可由多個程式同時使用的 和資料的庫,動態庫不是可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行 的函式。函式的可執行 位於乙個 動態庫 中,該 動態庫 包含乙個或多個已被編譯 鏈結並與使用它們的程序分開儲存的函式。動態庫 還有助於共享資料和資源。多個應用程式可同時訪問...