linux動態庫連接
『壹』 linux下的靜態鏈接庫和動態鏈接庫有什麼區別
學習Linux動態鏈接庫是一個繞不開的話題。動態鏈接庫與靜態鏈接庫之間存在著顯著的區別。靜態鏈接庫在編譯鏈接時,將庫文件的代碼全部加入到可執行文件中,生成的文件較大,但運行時無需庫文件。靜態庫後綴名為.a。相反,動態鏈接庫在程序運行時才被載入內存,節省了資源,並解決了靜態庫在更新、部署和發布時的麻煩。動態庫的後綴名為.so,gcc/g++在編譯時默認使用動態庫。
通過生成動態庫的步驟,可以了解如何將多個文件編譯成一個動態庫。創建一個頭文件和三個.cpp文件,然後將這幾個文件編譯成動態庫libdynamic.so。通過命令行參數,-shared和-fPIC選項來生成動態鏈接庫。在調用動態鏈接庫時,使用鏈接命令來創建可執行文件,參數-L和-ldynamic用於查找庫文件。
在測試鏈接時,可能會遇到ld提示找不到庫文件的問題。解決方法之一是編輯/etc/ld.so.conf文件,添加庫文件所在目錄,並通過ldconfig更新緩存文件。靜態庫的編譯過程同樣重要,通過ar命令創建靜態庫文件,並使用nm命令查看文件內容。
動態鏈接庫的優點在於進程間的資源共享,可以避免重復載入相同庫函數,大大節省了系統的內存資源。C的標准庫就是動態鏈接庫,使得系統中所有運行的程序共享同一代碼段。在編寫程序時,可以選擇何時鏈接動態鏈接庫函數,根據需求進行載入,從而節省系統資源。
動態鏈接庫在程序運行過程中根據需要載入特定功能,避免了一次性載入所有可能用到的函數,降低了內存佔用。例如,在處理不同文件類型時,只在確定文件類型後才載入相應的讀寫函數,避免了未使用的函數佔用內存。
總之,動態鏈接庫和靜態鏈接庫在編譯和運行時具有不同的特點和優勢。選擇何時使用動態鏈接庫取決於具體應用需求和資源優化目標。理解兩者之間的區別有助於更有效地利用資源,提高程序性能。
『貳』 linux 動態鏈接和靜態鏈接的區別
兩者區別:a,靜態庫的使用需要:1包含一個對應的頭文件告知編譯器lib文件裡面的具體內容2設置lib文件允許編譯器去查找已經編譯好的二進制代碼b,動態庫的使用:程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫c,依賴性:靜態鏈接表示靜態性,在編譯鏈接之後,lib庫中需要的資源已經在可執行程序中了,也就是靜態存在,沒有依賴性了動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供需要的動態庫,有依賴性,運行時候沒有找到庫就不能運行了d,區別:簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。做成靜態庫可執行文件本身比較大,但不必附帶動態庫做成動態庫可執行文件本身比較小,但需要附帶動態庫鏈接靜態庫,編譯的可執行文件比較大,當然可以用strip命令精簡一下(如:striplibtest.a),但還是要比鏈接動態庫的可執行文件大。程序運行時間速度稍微快一點。靜態庫是程序運行的時候已經調入內存,不管有沒有調用,都會在內存里頭。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。其在編譯程序時若鏈接,程序運行時會在系統指定的路徑下搜索,然後導入內存,程序一般執行時間稍微長一點,但編譯的可執行文件比較小;動態庫是程序運行的時候需要調用的時候才裝入內存,不需要的時候是不會裝入內存的。動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。動態鏈接庫的特點與優勢首先讓我們來看一下,把庫函數推遲到程序運行時期載入的好處:1.可以實現進程之間的資源共享。什麼概念呢?就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些「動態鏈接」額外的開銷,卻大大的節省了系統的內存資源。C的標准庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標准庫的代碼段。2.將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows就是一個很好的例子。3.甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。程序員在編寫程序的時候,可以明確的指明什麼時候或者什麼情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟體,但每次運行的時候,由於不同的操作需求,只有一小部分程序被載入內存。所有的函數本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以後再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然後才發覺在整個程序中根本沒有用到它們。靜態庫:在編譯的時候載入生成目標文件,在運行時不用載入庫,在運行時對庫沒有依賴性。動態庫:在目標文件運行時載入,手動載入,且對庫有依賴性。具體在開發中用到哪種庫,我覺得還是根據實際的內存大小,ROM大小,運行的速度等綜合考慮。