多文件動態庫編譯
Linux動態庫的編譯與使用 轉載
http://hi..com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html
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;i<N;i++)
{
if(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為後綴。
–fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
–shared:指明編譯成動態庫。
第三步:使用動態庫
1. 編譯時使用動態庫
文件1.動態庫使用文件test.c
//使用動態庫libtest.so,該文件名為test.c
#include "getmaxlen.h"
int main()
{
int Sel[] = {2,3,6,5,3,2,1,2,3,4,5,6,7,6,5};
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[] = {1,2,5,4,5,8,6,5,9,5,4,5,4,1};
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
gcc -o test test.c ./libmytools.so
Ⅱ acc和gcc編譯動態庫的區別
編譯動態庫時,acc使用-b開關,gcc使用-share開關,acc使用-AA開關編譯標准c++代碼,-mt加入多線程鏈接,gcc使用-pthread開關,acc使用+Markered開關編譯出cpp文件所需的頭文件,並以xxx.d文件形式存放,acc和gcc的共同的開關有-I加入頭文件目錄,-l開關加入依賴的動態庫鏈接,-L開關加入動態庫搜尋的路徑,-o開關輸出目標文件,-g開關加入調試信息,-w開關加入警告級別。在64位的機器上,acc使用+DD32開關編譯32位程序,gcc使用-milp32編譯32位程序,此外,在64位機器上,默認是編譯32位的程序。
Ⅲ linux下,有幾個.so。如何將這幾個動態庫編譯成一個動態庫
g++ -l*** -l*** -L 庫目錄. 一次g++ 是可以同時連接多個動態庫的.不用把多個動態庫編成一個.
Ⅳ 動態庫 是什麼
首先,想要知道動態庫,我們得了解C++/C以及計算機的一些背景知識。
一般而言,在Windows下,*.dll文件就是動態庫文件。用C++/C開發的程序,在發布的時候,會出現兩種情況,第一,整個軟體就只有一個文件,你只要雙擊那個exe文件,就可以運行。第二,除了exe之外,還有dll等文件。在這里,我們假設的文件只有exe文件和dll文件, 不討論什麼圖標之類文件。
只有一個文件的,庫已經嵌到那個exe裡面。而有很多dll文件的程序,庫沒有嵌入到exe裡面。所以,你可以看一下,如果那個exe文件大小非常大,那就說明是靜態鏈接,在開發的時候是使用靜態庫。如果那個exe非常小,那麼一般是使用的動態庫。
那麼問題來了,動態庫與靜態庫相比優勢又是什麼。動態庫節約內存,為什麼這么說呢。假如兩個類型的程序,如果他們都有一個共同使用的dll,那麼在內存裡面,只有一份,而不是兩份。如果是使用了靜態庫,這會有兩份,會有很大的浪費空間。
當然,使用動態庫還有需要注意的地方。比如,有兩個名字一模一樣的動態庫Qtcore4.dll,但是呢,一個dll是用vs2010編譯器生成的,一個是用vs2015編譯器生成的。如果,exe使用的dll弄錯的話,程序結果會不對或者其他奇葩的問題。
以上均是一個大致的講解,細節部分請參考程序員的自我修養這本書!