導航:首頁 > 源碼編譯 > 演算法動態庫是什麼意思

演算法動態庫是什麼意思

發布時間:2023-01-22 04:08:55

⑴ C語言中靜態庫和動態庫的區別,如何使用它們

一般C語言寫的程序可以讓其他語言進行調用,比如python, java,等等

c語言有兩種庫類型,靜態庫和動態庫(共享庫)

命令:ar rcs libmulib.a file1.o

⑵ 那位高手幫忙講一下,什麼叫動態庫。盡量簡單明了一點,謝謝

一、動態鏈接庫的概念 動態鏈接庫(Dynamic Link Library,縮寫為DLL)是一個可以被其它應用程序共享的程序模塊,其中封裝了一些可以被共享的常式和資源。動態鏈接庫文件的擴展名一般是dll,也有可能是drv、sys和fon,它和可執行文件(exe)非常類似,區別在於DLL中雖然包含了可執行代碼卻不能單獨執行,而應由Windows應用程序直接或間接調用。 動態鏈接是相對於靜態鏈接而言的。所謂靜態鏈接是指把要調用的函數或者過程鏈接到可執行文件中,成為可執行文件的一部分。換句話說,函數和過程的代碼就在程序的exe文件中,該文件包含了運行時所需的全部代碼。當多個程序都調用相同函數時,內存中就會存在這個函數的多個拷貝,這樣就浪費了寶貴的內存資源。而動態鏈接所調用的函數代碼並沒有被拷貝到應用程序的可執行文件中去,而是僅僅在其中加入了所調用函數的描述信息(往往是一些重定位信息)。僅當應用程序被裝入內存開始運行時,在Windows的管理下,才在應用程序與相應的DLL之間建立鏈接關系。當要執行所調用DLL中的函數時,根據鏈接產生的重定位信息,Windows才轉去執行DLL中相應的函數代碼。 一般情況下,如果一個應用程序使用了動態鏈接庫,Win32系統保證內存中只有DLL的一份復製品,這是通過內存映射文件實現的。DLL首先被調入Win32系統的全局堆棧,然後映射到調用這個DLL的進程地址空間。在Win32系統中,每個進程擁有自己的32位線性地址空間,如果一個DLL被多個進程調用,每個進程都會收到該DLL的一份映像。與16位Windows不同,在Win32中DLL可以看作是每個進程自己的代碼。 二、動態鏈接庫的優點 1. 共享代碼、資源和數據 使用DLL的主要目的就是為了共享代碼,DLL的代碼可以被所有的Windows應用程序共享。 2. 隱藏實現的細節 DLL中的常式可以被應用程序訪問,而應用程序並不知道這些常式的細節。 3. 拓展開發工具如Delphi的功能 由於DLL是與語言無關的,因此可以創建一個DLL,被C++、VB或任何支持動態鏈接庫的語言調用。這樣如果一種語言存在不足,就可以通過訪問另一種語言創建的DLL來彌補。 三、動態鏈接庫的實現方法 1. Load-time Dynamic Linking 這種用法的前提是在編譯之前已經明確知道要調用DLL中的哪幾個函數,編譯時在目標文件中只保留必要的鏈接信息,而不含DLL函數的代碼;當程序執行時,利用鏈接信息載入DLL函數代碼並在內存中將其鏈接入調用程序的執行空間中,其主要目的是便於代碼共享。 2. Run-time Dynamic Linking 這種方式是指在編譯之前並不知道將會調用哪些DLL函數,完全是在運行過程中根據需要決定應調用哪個函數,並用LoadLibrary和GetProcAddress動態獲得DLL函數的入口地址。 代碼如下: 在Microsoft Visual Studio .NET 2003中創建動態鏈接庫的步驟如下: 1.新建項目 2.Win32 控制台項目 3.應用程序設置 4.選擇DLL項 完成,直接在後面添加代碼即可: extern "C" _declspec(dllexport) int sum(int x,int y) { return x+y; } 代碼編輯完成後,選擇「生成」菜單中的「生成mydll」,即可生成動態連接庫文件。 下面是測試動態連接庫的代碼: #include #include int main(void) { typedef int (*pf)(int,int); pf add; HINSTANCE his; if((his=LoadLibrary("mydll"))==NULL) { printf("load dll error\n"); return -1; } if((add=(pf)GetProcAddress(his,"add"))==NULL) { printf("load function error\n"); return -1; } printf("%d\n",add(10,20)); FreeLibrary(his); return 0; }

⑶ 計算機動態庫是

 DLL(Dynamic Linkable Library)動態鏈接庫亦簡稱動態庫,它是一塊封裝好的代碼塊,包含著一些方法,一般不包括消息循環,也建議不要去包含這些。可把它看成一個倉庫,其提供了可直接使用的變數、函數、類等。打個不太生動的比喻,動態庫猶如保衛森嚴的生產基地,但你可以通過正確入口進入,獲得你想要的東西,你不用管也管不著這東西是怎麼生產的,拿走從出口出來就行,同時生產基地是共享的,大家都可以通過入口獲得相應的東西。

      在「庫」的發展史上經歷了「無庫---靜態庫---動態庫」的時代,無論是動態庫還是靜態庫都能解決代碼共享的問題。

動態庫是基於二進制級重用的,所以與語言無關、環境無關(前提是你動態庫中沒有涉及對環境有依賴的東西,如調用一些第三方DLL等)的,再一個得遵循DLL介面規范和調用約定,簡而言之,用各種語言編寫的標准DLL其他語言都可以調用。所以如果想創建一個通用的DLL,那麼得嚴格遵守DLL規范,包括導出、調用約定、形參幾方面的內容。

⑷ 動態庫和靜態庫的區別

我們通常把一些公用函數製作成函數庫,供其它程序使用。

函數庫分為靜態庫和動態庫兩種。

靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。

動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。

本文主要通過舉例來說明在linux中如何創建靜態庫和動態庫,以及使用它們。

在創建函數庫前,我們先來准備舉例用的源程序,並將函數庫的源程序編譯成.o文件。

第1步:編輯得到舉例的程序--hello.h、hello.c和main.c;

hello.h(見程序1)為該函數庫的頭文件。

hello.c(見程序2)是函數庫的源程序,其中包含公用函數hello,該函數將在屏幕上輸出"Hello XXX!"。

main.c(見程序3)為測試庫文件的主程序,在主程序中調用了公用函數hello。

程序1: hello.h

#ifndef HELLO_H

#define HELLO_H

void hello(const char *name);

#endif //HELLO_H

程序2: hello.c

#include

void hello(const char *name)

{

printf("Hello %s!/n", name);

}

程序3: main.c

#include "hello.h"

int main()

{

hello("everyone");

return 0;

}

第2步:將hello.c編譯成.o文件;

無論靜態庫,還是動態庫,都是由.o文件創建的。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件。

在系統提示符下鍵入以下命令得到hello.o文件。

# gcc -c hello.c

#

(注1:本文不介紹各命令使用和其參數功能,若希望詳細了解它們,請參考其他文檔。)

(注2:首字元"#"是系統提示符,不需要鍵入,下文相同。)

我們運行ls命令看看是否生存了hello.o文件。

# ls

hello.c hello.h hello.o main.c

#

(注3:首字元不是"#"為系統運行結果,下文相同。)

在ls命令結果中,我們看到了hello.o文件,本步操作完成。

下面我們先來看看如何創建靜態庫,以及使用它。

第3步:由.o文件創建靜態庫;

靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為myhello,則靜態庫文件名就是libmyhello.a。在創建和使用靜態庫時,需要注意這點。創建靜態庫用ar命令。

在系統提示符下鍵入以下命令將創建靜態庫文件libmyhello.a。

# ar cr libmyhello.a hello.o

#

我們同樣運行ls命令查看結果:

# ls

hello.c hello.h hello.o libmyhello.a main.c

#

ls命令結果中有libmyhello.a。

第4步:在程序中使用靜態庫;

靜態庫製作完了,如何使用它內部的函數呢?只需要在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然後在用gcc命令生成目標文件時指明靜態庫名,gcc將會從靜態庫中將公用函數連接到目標文件中。注意,gcc會在靜態庫名前加上前綴lib,然後追加擴展名.a得到的靜態庫文件名來查找靜態庫文件。

在程序3:main.c中,我們包含了靜態庫的頭文件hello.h,然後在主程序main中直接調用公用函數hello。下面先生成目標程序hello,然後運行hello程序看看結果如何。

# gcc -o hello main.c -L. -lmyhello

# ./hello

Hello everyone!

#

我們刪除靜態庫文件試試公用函數hello是否真的連接到目標文件 hello中了。

# rm libmyhello.a

rm: remove regular file `libmyhello.a'? y

# ./hello

Hello everyone!

#

程序照常運行,靜態庫中的公用函數已經連接到目標文件中了。

我們繼續看看如何在Linux中創建動態庫。我們還是從.o文件開始。

第5步:由.o文件創建動態庫文件;

動態庫文件名命名規范和靜態庫文件名命名規范類似,也是在動態庫名增加前綴lib,但其文件擴展名為.so。例如:我們將創建的動態庫名為myhello,則動態庫文件名就是libmyhello.so。用gcc來創建動態庫。

在系統提示符下鍵入以下命令得到動態庫文件libmyhello.so。

# gcc -shared -fPCI -o libmyhello.so hello.o

#

我們照樣使用ls命令看看動態庫文件是否生成。

# ls

hello.c hello.h hello.o libmyhello.so main.c

#

第6步:在程序中使用動態庫;

在程序中使用動態庫和使用靜態庫完全一樣,也是在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然後在用gcc命令生成目標文件時指明動態庫名進行編譯。我們先運行gcc命令生成目標文件,再運行它看看結果。

# gcc -o hello main.c -L. -lmyhello

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

#

哦!出錯了。快看看錯誤提示,原來是找不到動態庫文件libmyhello.so。程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。我們將文件 libmyhello.so復制到目錄/usr/lib中,再試試。

# mv libmyhello.so /usr/lib

# ./hello

Hello everyone!

#

成功了。這也進一步說明了動態庫在程序運行時是需要的。

我們回過頭看看,發現使用靜態庫和使用動態庫編譯成目標程序使用的gcc命令完全一樣,那當靜態庫和動態庫同名時,gcc命令會使用哪個庫文件呢?抱著對問題必究到底的心情,來試試看。

先刪除 除.c和.h外的 所有文件,恢復成我們剛剛編輯完舉常式序狀態。

# rm -f hello hello.o /usr/lib/libmyhello.so

# ls

hello.c hello.h main.c

#

在來創建靜態庫文件libmyhello.a和動態庫文件libmyhello.so。

# gcc -c hello.c

# ar cr libmyhello.a hello.o

# gcc -shared -fPCI -o libmyhello.so hello.o

# ls

hello.c hello.h hello.o libmyhello.a libmyhello.so main.c

#

通過上述最後一條ls命令,可以發現靜態庫文件libmyhello.a和動態庫文件libmyhello.so都已經生成,並都在當前目錄中。然後,我們運行gcc命令來使用函數庫myhello生成目標文件hello,並運行程序 hello。

# gcc -o hello main.c -L. -lmyhello

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

#

從程序hello運行的結果中很容易知道,當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。

⑸ 什麼叫靜態庫和動態庫

兩者區別:
一,靜態庫的使用需要:
1
包含一個對應的頭文件告知編譯器lib文件裡面的具體內容
2
設置lib文件允許編譯器去查找已經編譯好的二進制代碼
二,動態庫的使用:
程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫
三,依賴性:
靜態鏈接表示靜態性,在編譯鏈接之後,
lib庫中需要的資源已經在可執行程序中了,
也就是靜態存在,沒有依賴性了
動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供
需要的
動態庫,有依賴性,
運行時候沒有找到庫就不能運行了
四,區別:
簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。
做成靜態庫可執行文件本身比較大,但不必附帶動態庫
做成動態庫可執行文件本身比較小,但需要附帶動態庫
五:
首先糾正所謂「靜態連接就是把需要的庫函數放進你的exe之中」的說法。在真實世界中,有三個概念:use
static
libary,
static
linked
dll,
dynamic
linked
dll.
多數人混淆了static
libary

static
linked
dll的概念,當然他們有似是而非的「相似之處」,比如都用到.lib,下面具體說明。
使用靜態庫(use
static
libary)是把.lib和其他.obj一起build在目標文件中,目標文件可以是.exe,也可以是.dll或.oxc等。一般情況下,可以根本就沒有「對應的」.dll
文件,如c
run
time(crt)庫。一個例子就是,寫一個main(){},build出來並不是只有幾個位元組,當然有人會說那還有exe文件頭呢?是,即使加上文件頭的尺寸,build出的執行文件仍然「莫名的大」。實際上那多出來的部分就是crt靜態庫。姑且可以把靜態庫.lib理解成外部程序的obj文件比較合理,它包含了函數的實現。

⑹ 動態庫 是什麼

首先,想要知道動態庫,我們得了解C++/C以及計算機的一些背景知識。
一般而言,在Windows下,*.dll文件就是動態庫文件。用C++/C開發的程序,在發布的時候,會出現兩種情況,第一,整個軟體就只有一個文件,你只要雙擊那個exe文件,就可以運行。第二,除了exe之外,還有dll等文件。在這里,我們假設的文件只有exe文件和dll文件, 不討論什麼圖標之類文件。
只有一個文件的,庫已經嵌到那個exe裡面。而有很多dll文件的程序,庫沒有嵌入到exe裡面。所以,你可以看一下,如果那個exe文件大小非常大,那就說明是靜態鏈接,在開發的時候是使用靜態庫。如果那個exe非常小,那麼一般是使用的動態庫。
那麼問題來了,動態庫與靜態庫相比優勢又是什麼。動態庫節約內存,為什麼這么說呢。假如兩個類型的程序,如果他們都有一個共同使用的dll,那麼在內存裡面,只有一份,而不是兩份。如果是使用了靜態庫,這會有兩份,會有很大的浪費空間。
當然,使用動態庫還有需要注意的地方。比如,有兩個名字一模一樣的動態庫Qtcore4.dll,但是呢,一個dll是用vs2010編譯器生成的,一個是用vs2015編譯器生成的。如果,exe使用的dll弄錯的話,程序結果會不對或者其他奇葩的問題。
以上均是一個大致的講解,細節部分請參考程序員的自我修養這本書!

⑺ C語言裡面的動態庫和靜態庫

之所以成為【靜態庫】,是因為在鏈接階段,會將匯編生成的目標文件.o與引用到的庫一起鏈接打包到可執行文件中。因此對應的鏈接方式稱為靜態鏈接。
試想一下,靜態庫與匯編生成的目標文件一起鏈接為可執行文件,那麼靜態庫必定跟.o文件格式相似。其實一個靜態庫可以簡單看成是一組目標文件(.o/.obj文件)的集合,即很多目標文件經過壓縮打包後形成的一個文件。靜態庫特點總結:

為什麼需要動態庫,其實也是靜態庫的特點導致。

動態庫特點總結:

生成動態庫

⑻ 動態庫和靜態庫的區別

函數庫分為靜態庫和動態庫兩種。

⑼ 請教關於linux中靜態庫與動態庫的問題

哈哈,簡單的來說可以按你這么理解,靜態庫就是在打包在程序裡面的,而動態庫是和程序分離開的,是程序需要的時候動態裝配進內存的。

說一下我自己的理解和經驗吧:動態庫之所以會用到,是因為有些庫會被多個程序用到,拿windows的例子來說吧,比方說你開兩個游戲,一個魔獸,一個極品飛車,這兩個都要用到activex 這個庫,如果做為動態庫,兩個程序共用一個,但是靜態庫就要分別為兩個游戲都生成庫,如果更多的話,這樣就浪費了內存很多空間。

靜態庫是和程序一起裝入內存的(其實靜態庫已經成為程序的一部分),而動態庫是動態裝入內存的,如果內存不大,又使用靜態庫,必然會發生很多的缺頁中斷,這樣效率會很低哦,你有興趣可以多多研究一下內存的一些演算法,linux kernel有現成的分頁演算法,會對你很有幫助的。

如果缺頁中斷不太明白的話可以看看操作系統的書,或者追問我,大家一起切磋交流~

閱讀全文

與演算法動態庫是什麼意思相關的資料

熱點內容
縱向加密密鑰協商狀態時間 瀏覽:850
mc花雨庭伺服器有些什麼 瀏覽:809
linux製作網頁 瀏覽:19
xlsx加密忘記了怎麼辦 瀏覽:999
app湖北農信怎麼解約 瀏覽:426
在線編程教育項目 瀏覽:759
電信采購5萬台伺服器干什麼用 瀏覽:200
騰訊雲伺服器登錄地址 瀏覽:987
程序員在地鐵上寫字 瀏覽:555
解壓包未知文件格式怎麼辦 瀏覽:576
程序員破壞資料庫 瀏覽:331
sh格式如何編譯 瀏覽:344
虛擬伺服器雲主機哪個好 瀏覽:98
單片機埠保護 瀏覽:948
iso壓縮gho 瀏覽:14
網關熔斷器演算法 瀏覽:629
不銹鋼高度演算法 瀏覽:170
基於單片機的畢業設計論文 瀏覽:658
久佳跑步機的app怎麼下載 瀏覽:201
python列印心形 瀏覽:48