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),釋放動態鏈接庫。
linux標準庫是動態還是靜態?
編譯器的默認設置是連接動態庫,這就要求在程序執行的時候需要的動態庫必須存在。改變編譯選項可以變為靜態連接,這樣生成的程序運行時不需要庫的支持,但是文件的尺寸一般較大。
linx的C標準庫都有,看你自己喜歡哪樣用哪樣。
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然后將它們拷貝到執行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。
然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記指明當程序執行時,首先必須載入這個庫。由于動態庫節省空間,linux下進行連接的缺省操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
linux下的動態鏈接庫和靜態鏈接庫到底是個什么鬼?
動態庫和靜態庫都是一組函數集合,打包在一起供應用程序調用,區別是:靜態庫名稱一般為xxx.a,在編譯時和應用程序鏈接在一起,這樣的應用程序占用空間較大。動態庫名稱一般為xxx.so,對于動態庫即可以在編譯時鏈接,也可以使用dlopen()/dlsym()/dlclose()函數在運行時調用,后種方式占用空間較小,且可以實現動態庫在進程間共享,只在內存中保留一份,減少了內存開銷。
linuxc編程調用系統的動態庫時,要使用dlopen等函數嗎?
linux調用庫的方式有三種:
1.靜態鏈接庫
2.動態鏈接庫
3.動態加載庫
其中1,2都是在編程時直接調用,在鏈接時加參數-l進行鏈接
第三種需要在編程時使用dlopen等函數來獲取庫里面函數的定義,然后進行調用.
不過對于沒有提供頭文件的動態庫,只能dlopen等函數來調用
如何更新linux系統動態鏈接庫/usr/local/lib/usr/lib?
可以放在當前目錄下,但是要設置一下庫文件的路徑:LD_LIBRARY_PATH=./:/usr/local/pet20/lib:/lib/:/usr/local/lib export LD_LIBRARY_PATH 這樣,在調用的時候就會自動從當前目錄找。
如果是顯式調用則不用,只要在程序里指定.so的文件路徑就可以了。所以放在當前目錄下也是沒問題的。
總結
以上是生活随笔為你收集整理的linux动态链接库(linux 动态链接)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在JDK 9(以及8)以及更高版本中,所
- 下一篇: 入户加急备案需要多久(入户加急备案)