預處理指令
g++ -E main.cpp -o main.i
編譯成彙編指令
g++ -S main.i -o main.s
靜態鏈接 (後綴爲.a )
假設有這些文件add.h,add.cpp,sub.h,sub.cpp
- 由.o文件創建靜態庫可以使用命令
g++ -c add.cpp sub.cpp
ar cr libmymath.a add.o sub.o
ar tv libmylib.a
可以顯示庫文件中有哪些目標文件,顯示文件名,時間和大小信息- 在程序中使用靜態庫使用命令
g++ -o main main.cpp -L. -lmymath
動態鏈接 (後綴名爲.so)
- 創建動態鏈接庫可以使用
g++ -fPIC -o add.o -c add.cpp
g++ -fPIC -o sub.o -c sub.cpp
g++ -shared -o libmymath.so add.o sub.o
也可以使用
g++ -fPIC -shared -o libmymath.so add.cpp sub.cpp
-fPIC
表示編譯爲位置獨立的代碼,如果不用此選項的話,不能達到真正的代碼段共享的目的
-Lpath
表示在path
目錄中搜索庫文件,如-L.
表示在當前目錄
-Ipath
表示在path
目錄中搜索頭文件
- 在程序中使用動態庫
g++ -o main main.cpp -L. -lmymath
此時運行main
程序會出錯,因爲程序運行時會在/usr/lib
和/lib
中查找需要的動態庫文件
動態庫的搜索路徑先後順序爲:
- 編譯目標代碼時指定的動態庫搜索路徑
- 環境變量
LD_LIBRARY_PATH
指定的動態庫搜索路徑 - 配置文件
/etc/ld.so.conf
中指定的動態庫搜索路徑,只需要在該文件後追加一行完整路徑如/root/test/lib
即可,然後ldconfig
使修改生效 - 默認的動態庫搜索路徑
/lib
- 默認的動態庫搜索路徑
/usr/lib
- 未解決上述問題,採取的步驟爲(採用其一即可):
- 將文件
libmymath.so
複製到目錄/usr/lib
中 - 修改環境變量
LD_LIBRARY_PATH
,具體命令爲
export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH sodu ldconfig
靜態鏈接庫和動態鏈接庫的特點
- 動態鏈接庫有利於進程間資源共享。當某個進程需要調用某個動態鏈接庫的函數時,操作系統會查看所有正在運行的進程,看內存裏是夠有此庫函數的拷貝,如果有,則共享那一份拷貝,否則鏈接載入。而靜態鏈接庫不同,每個程序都需要將用到的庫函數拷貝到自己的代碼段
- 動態鏈接庫使得程序升級更容易,只要接口不變,新的動態鏈接庫直接可以使用
- 靜態鏈接是編譯時鏈接,而動態鏈接是運行時鏈接,所以靜態鏈接的程序執行速度更快