1. 什麼叫靜態庫和動態庫
靜態庫是在編譯時鏈接到程序中的庫,而動態庫是在運行時載入的庫。
靜態庫: 定義:是二進制文件的一個集合,包含了程序運行所需的一系列函數和數據。 鏈接方式:在編譯時會被直接嵌入到最終生成的可執行文件中。 優點:程序運行時不需要再載入額外的庫文件,運行速度快,具有很好的可移植性。 缺點:程序體積相對較大,如果多個程序使用相同的靜態庫,會導致存儲空間浪費。
動態庫: 定義:是一種在程序運行時由操作系統動態載入的庫。 鏈接方式:不會在編譯時被嵌入到可執行文件中,而是在程序運行時載入。 優點:可以被多個程序共享使用,節省存儲空間;程序啟動更快,響應更快。 缺點:開發時需要處理復雜的依賴關系,在不同操作系統上需要不同的動態鏈接機制;程序的可移植性相對較差;程序調試和錯誤排查可能更復雜。
2. linux下使用nm指令查看靜態庫/動態庫編譯內容
在Linux環境下,當你遇到鏈接庫問題時,深入理解庫的編譯內容變得尤為重要。這時,nm指令就成為一個有效的工具,幫助我們揭示靜態庫和動態庫內的編譯細節。
首先,對於靜態庫,我們可以使用命令
nm -g libname.a
執行後,如圖所示,它會列出靜態庫中的全局變數和函數介面,讓你清晰地看到庫的內部結構。
而對於動態庫,其查看方式為
nm -g libname.so
同樣會顯示出動態庫的編譯內容,包括函數和符號,這對於定位和修復與庫相關的bug時非常有用。
因此,在鏈接第三方庫或處理bug時,記得利用nm指令來記錄和分析庫的編譯內容,它能提供寶貴的線索和信息。