C++靜態庫與動態庫

1.靜態庫

1.靜態庫實際上就是一些目標文件(一般以.o結尾)的集合,靜態庫一般以.a結尾,只用於生成可執行文件階段。
2.在鏈接步驟中,鏈接器將從庫文件取得所需代碼,複製到生成的可執行文件中。這種庫稱爲靜態庫。其特點是
可執行文件中包含了庫代碼的一份完整拷貝,在編譯過程中被載入程序中。缺點就是多次使用就會有多份拷貝,
並且對程序的更新、部署和發佈會帶來麻煩,如果靜態庫有更新,那麼所有使用它的程序都需要重新編譯、發佈。

命令:首先生成目標文件 gcc -c test.c -o test.o
	使用ar命令將目標文件打包成靜態庫 ar rcs libtest.a test.o
	查看靜態庫內容 ar t libtest.a

	鏈接靜態庫命令 gcc -o test test.c -L. -ltool  該命令直接將庫文件鏈接到目標文件中,生成可執行文件test
	-L表示指定了尋找庫文件的路徑 .表示當前路徑  -l表示要鏈接的靜態庫 tool就是靜態庫的名字
	ldd 可執行文件 查看可執行文件 鏈接到了哪些庫。

2.動態庫

1.動態庫在鏈接階段沒有被複制到程序中,而是在程序運行時由系統動態加載到內存中供程序調用
2.系統只需載一次動態庫,不同的程序可以得到內存中相同動態庫的副本,因此節省了很多內存

命令:首先生成目標文件 gcc -c test.c
使用-fPIC和-shared生成動態庫 gcc -shared -fPIC -o libtest.so test.o

鏈接動態庫命令 gcc -o test test.c -L. -ltool 跟鏈接靜態庫的命令一樣,如果當前庫中有兩種庫 優先加載 動態庫
LD_LIBRARY_PATH=指定查找共享庫

3.靜態庫與動態庫的區別

載入時刻不同:
1.靜態庫在程序編譯時會鏈接到目標代碼中,程序運行時不再需要靜態庫,因此體積較大。而且每次編譯都需要載入
靜態代碼,因此內存開銷大。
2.動態庫在程序編譯時不會被鏈接到代碼中,而是在程序運行時才被載入,程序運行時需要動態庫存在,因此體積小。
而且系統只需載入一次動態庫,不同程序可以得到內存中相同動態庫的副本,因此內存開銷小。
發佈了126 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章