靜態鏈接庫和動態鏈接庫的區別
一、靜態鏈接庫
預編譯->編譯->匯編->鏈接
Linux:
生成目標文件
g++ -c source.cpp -o source.o
打包成靜態鏈接庫
ar -crv source.a source.o
使用靜態鏈接庫
g++ test.cpp -L靜態鏈接庫目錄 -l靜態鏈接庫名稱沒有后綴
二、動態鏈接庫
使用動態鏈接庫是為了規避靜態鏈接庫的兩個問題。
一個是多個副本的問題,對於靜態庫都是在編譯時刻將其編譯到源代碼當中,在運行時刻不會再和靜態庫有任何關系。這樣的好處是快,但是造成了空間的浪費
另一個是發布的一致性問題和更新問題,如果是靜態庫,如果對靜態庫進行了更新,那么需要重新編譯代碼,並且提示用戶進行下載整個軟件,這樣會造成很多不變,浪費大量帶寬。如果是動態庫,只需要更新相應的動態鏈接庫即可,整個軟件不需要修改。
Linux平台:
生成目標文件
g++ -fPIC source.cpp -o source.o
動態鏈接庫
g++ -shared source.so source.o
或者合並為一個命令
g++ -fPIC -shared source.so source.cpp
關於在使用中定位動態鏈接庫的位置,需要注意一些問題,默認動態鏈接庫是在/lib 或者 /usr/lib之下的
如果要在其他文件夾之下,需要修改 /etc/ld.so.cache文件