當前位置:編程學習大全網 - 編程語言 - linux使用動態庫需要配環境麽linux使用動態庫

linux使用動態庫需要配環境麽linux使用動態庫

LINUX動態鏈接庫的創建與使用?

對於動態鏈接庫來說,程序的可執行文件當中會留有壹個它的標記,當程序運行到相應的標記的時候,就會調用相應的動態庫。由於動態庫節省空間,所以壹般linux下面鏈接程序的時候都是默認的按照動態方式鏈接的。

如何在linux平臺生成靜態鏈接庫與動態鏈接庫?

動態庫和靜態庫

在Win下,動態庫以.dll結尾,靜態庫以.lib結尾。

在Linux下,動態庫文件以.so結尾,靜態庫以.a結尾。

在Mac下,動態庫以.dylib結尾,靜態庫以.a結尾。

動態庫的優勢和劣勢

動態函數庫在編譯的時候並沒有被編譯進目標代碼中,妳的程序執行到相關函數時才調用該函數庫裏的相應函數,因此動態函數庫所產生的可執行文件比較小。由於函數庫沒有被整合進妳的程序,而是程序運行時動態的申請並調用,所以程序的運行環境中必須提供相應的庫。動態函數庫的改變並不影響妳的程序,所以動態函數庫的升級比較方便。

某個程序在運行時要調用某個動態鏈接庫函數的時候,OS首先查看所有正在運行的進程,找找看是否已經有人載入了這個庫。如果有的話,直接用。如果沒有才會載入。這樣的第壹個優點就是節省內存空間。動態調入意味著是等需要的時候才調入內存,而不是不管用不用都要先放到內存裏來。

我如果想要升級某個軟件。如果升級的位置是在dll裏,那軟件其他的部位不需要重新編譯鏈接。所以升級方便。

靜態庫的優勢和劣勢

利用靜態函數庫編譯成的文件比較大,因為整個函數庫在編譯時都會被整合進目標代碼中,他的優點就顯而易見了,即編譯後的執行程序不需要外部的函數庫支持,因為所有使用的函數都已經被編譯進去了。當然這也會成為他的缺點,因為如果妳靜態鏈接的函數庫改變了,那麽妳的程序必須重新編譯。

代碼更精簡,因為不必做版本檢查。

程序分發時文件個數少,因為靜態鏈接到源文件裏了。

只編譯進來庫中所用的部分,而不用整個庫。

生成的binary占空間更大。

重復的庫可能出現在多個進程,浪費內存。

庫內部更新的話需要重新編譯binary。

Linux平臺的靜態庫

靜態庫的生成靜態庫的鏈接

Linux平臺的動態庫

動態庫的生成動態庫的鏈接

Windows平臺的靜態庫

靜態庫的生成/MT使用LIBCMT.lib編譯以創建多線程可執行文件。生成靜態庫lib。r靜態庫的鏈接

1、在使用鏈接庫的代碼開頭加入,第二行是要調用的鏈接庫裏的函數:

2、將要調用的鏈接庫的lib放入項目源代碼中,然後編譯。(編譯的時候不需要dll。這裏把靜態部分lib編譯進了exe,但動態庫dll還沒用。)

3、運行之前要把dll放到exe目錄下。

Windows平臺的動態庫

動態庫的生成/MD使用MSVCRT.lib編譯以創建多線程DLL。生成動態庫。r動態庫的鏈接

1、LoadLibrary(或MFC的AfxLoadLibrary),裝載動態庫。

2、GetProcAddress,獲取要引入的函數,將符號名或標識號轉換為DLL內部地址。

3、FreeLibrary(或MFC的AfxFreeLibrary),釋放動態鏈接庫。

linuxc編程調用系統的動態庫時,要使用dlopen等函數嗎?

linux調用庫的方式有三種:

1.靜態鏈接庫

2.動態鏈接庫

3.動態加載庫

其中1,2都是在編程時直接調用,在鏈接時加參數-l進行鏈接

第三種需要在編程時使用dlopen等函數來獲取庫裏面函數的定義,然後進行調用.

不過對於沒有提供頭文件的動態庫,只能dlopen等函數來調用

linux動態庫和靜態庫的區別?

動態鏈接庫和靜態鏈接庫壹般是編譯集成壹系列的接口(函數)

在程序源代碼編譯完成後通過編譯器編譯並通過鏈接器與這些庫進行鏈接

動態鏈接庫與靜態鏈接庫的區別在於鏈接器在進行鏈接時靜態庫會被直接編譯進程序裏

而動態鏈接庫並不會,我們這裏將這些鏈接庫稱作依賴(動態庫和靜態庫)

程序的運行需要這些依賴,程序在靜態鏈接後該程序本身便已包含該依賴

而動態鏈接後的程序本身本不包含該依賴,這些依賴需要執行者自行安裝進操作系統(動態庫、運行時庫)

程序運行時會動態地加載這些庫

linux上動態庫壹般的後綴後為.so

靜態庫壹般的後綴為.a

由於靜態鏈接會直接將庫編譯進程序裏所以靜態編譯後的程序相較於動態鏈接所要大

這就是因為靜態鏈接會將鏈接庫編譯進程序裏的原因,所以占用就要大了

出於這種原因,靜態庫不易於維護與更新,如果鏈接庫中有實現有bug等需要更新則需要更新整個程序,因為靜態庫被編譯進程序中了

但動態庫就沒有這種情況了,因為動態庫是程序運行時動態加載的,所以我們只需要更新動態庫而不需要更新所有依賴該庫的程序(軟件)

另壹方面,很多程序的開發都會使用到相同的鏈接庫,也就是很多程序(軟件)會有相同的依賴

如果將這些依賴全部靜態編譯的話將會造成存儲資源占用過多而造成資源浪費

而使用動態庫的方式這些程序(軟件)則可以***享壹個鏈接庫,而不需要每個程序都帶壹個鏈接庫,這樣就大大地減少了存儲資源占用空間

  • 上一篇:如何兌換泰銖人民幣兌換泰銖最劃算?
  • 下一篇:誰能幫我看下.NET程序員簡歷
  • copyright 2024編程學習大全網