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