前言
linux下的生成的動態庫和靜態庫沒有windows下方便
linux下gcc編譯默認動態鏈接和release
程序運行後調用動態庫
動態庫:
程序在運行的時候纔去鏈接動態庫的代碼,多個程序共享使用庫的代碼
可執行文件裏包含的不是庫,只是包含用到的函數入口地址一個表
一個動態庫鏈接的可執行文件僅僅包含它用到函數的入口地址的一個表,而不是外部函數所在目標文件的整個機器碼
什麼加載到內存,準備運行之前
在可執行文件開始運行以前,外部函數的機器碼由操作系統從磁盤上的該動態庫中複製到內存中,這個過程稱爲動態鏈接
動態鏈接的好處
動態庫可以在多個程序間共享,所以動態鏈接庫使得可執行文件更小,節省了磁盤空間。操作系統採用虛擬內存機制允許物理內存中的一份動態庫被要用到該庫的所有進程共用,節省了內存的磁盤空間
編譯鏈接程序鏈接靜態庫
靜態庫:
程序在編譯鏈接的時候把庫的代碼鏈接到可執行文件中。程序運行的時候將不在需要靜態庫
生成靜態庫
1.創建四個文件
main.c add.c sub.c sub.h add.h
2.寫好代碼
3.然後分別生成 sub.o 和 add.o
gcc -c sub.c -o sub.o
gcc -c add.c -o add.o
4.將sub.o和add.o打包起來生成libmymath.a
ar -rc libmymath.a *.o
5.生成可執行文件a.out
gcc main.c -L. -I. -lmymath
生成動態庫
1.用位置無關碼生成sub.o和add.o
gcc -fPIC sub.c add.c
2.生成動態庫
gcc -shared libmymath *.o
3.生成可執行文件main
gcc main.c -L. -I. -lmymath -o main
4.此時ldd發現main找不到動態庫,要修改環境變量。
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:yourpath
5.這個時候main找到了,完成
動態庫和靜態庫比較
比較空間的佔用
靜態庫–在程序編譯鏈接的時候被鏈接到可執行文件中
動態庫–是在程序運行之後才被加載到內存中,並且加載一個動態庫可以供多個程序使用(虛擬內存機制)
動態庫節約空間
時間效率
靜態庫–被鏈接到可執行文件中後就不再依賴動態庫了
動態庫–程序運行的時候還需要去內存中調用
靜態庫節約時間
可移植性
靜態庫–可執行文件生成後就不在依賴動態庫
動態庫–可執行文件生成後依然需要動態庫,如果動態庫沒有了,程序不能正常執行。
動態庫的可移植性差