Linux学习:静态库和动态库
1、庫是什么?
將“源代碼”變為“二進制格式的源代碼”(作用:加密,別人可以用,但不知道其中的內容)。
2、庫制作出來之后,如何給用戶使用?
需要給用戶:頭文件(內含接口聲明,相當于說明書),制作的庫。
3、靜態庫的制作和使用(windows 中叫 .lib 庫 Linux 叫.a 庫)
(1)命名規則:libxxx.a,其中
lib: 靜態庫標識
xxx :庫的實際名字
.a :Linux 靜態庫的后綴
(2) 制作步驟:
1)準備原材料:源代碼.c /.cpp 例:a.c 和b.c。
2)將 .c 文件 生成 .o 文件 例:gcc a.c b.c -c // 生成 a.o b.o。
3)將 .o 文件 打包 .a 庫文件 例:ar rcs libxxx.a a.o b.o。
4)發布: 將頭文件(放入 include 目錄)和庫文件(放入 lib 目錄),交給用戶。
注意:查看靜態庫內容(包含什么 .o 文件): nm libxxx.a
(3)靜態庫使用:
1)使用時候,test.c 中要包含靜態庫的頭文件。
2)在 test.c 中直接調用靜態庫中函數接口。
3)主要在編譯:gcc test.c -I ./include/ -L ./ilb -l xxx -o app : 生成 app 可執行程序。
注意:-I 是指定庫的名字(掐頭去尾)
4、動態庫的制作和使用(windows 是 .dll 庫 Linux 是.so 庫)
(1)命名規則:libxxx.so
(2)制作步驟:注意 gcc 參數
1)準備原材料:源代碼.c /.cpp 例:a.c b.c
2)將源文件生成.o 文件 例:gcc a.c b.c -c -fpic。
3)將 .o 文件 打包 .so 庫文件 例:gcc -shared a.o b.o -o libxxx.so 。
4)發布:將頭文件(放入 include 目錄)和庫文件(放入 lib 目錄),交給用戶。
(3)動態庫使用:
編譯生成 app 可執行文件:gcc test.c -I ./include/ -L ./ilb -l xxx -o app
注意:此時直接運行程序 ./app,會動態加載失敗(找不到 libxxx.so),會報錯!
error while loading shared libraries:libxxx.so:cannot open shared object file:NO such file or dirrctory
本質:ldd app(檢測 app 需要的所有動態庫的存放路徑和地址) 會發現 libxxx.so 出現not found
原因:
系統會先后從以下 4 個位置下尋找 動態庫的路徑,然后由動態連接器加載:
1)elf 文件的 DT_RPATH 段(位于可執行文件內部,不好修改)
2)環境變量 LD_LIBRARY_PATH
3)/etc/ld.so.cache 文件列表
4)/lib/ 或者 /user/lib 目錄
解決:
方式 1:將 .so 文件拷貝至 /lib 目錄(或者 /usr/lib 目錄)
sudo cp lib/libxxx.so /lib
此方法不推薦:因為每個人都放入這個目錄,如果有動態庫重名,會出現覆蓋的情況。
方式 2:更新 /etc/ld.so.cache 文件列表 (推薦此方法)
sudo vi /etc/ld.so.conf -> 添加存放動態庫的絕對路徑 ->執行更新命令:sudo ldconfig
方式 3:設置環境變量
臨時設置:關閉終端后會失效,只供測試用。
終端輸入命令 :export LD_LIBRARY_PATH =存放動態庫的絕對路徑:$LD_LIBRARY_PATH
永久設置:
(1)用戶級別 :
vi ~/.bashrc(打開配置文件)->將上方命令寫入 -> 完成后重啟終端。
(2)全局級別 :
vi /etc/profile(打開配置文件)->將上方命令寫入 ->完成后重啟終端。
5、 靜態庫和動態庫的區別
(1)靜態庫:靜態庫被打包到應用程序中,即使不執行程序,庫代碼仍然在 app 中。
優點:使用簡單;執行快;發布應用程序不需要發布庫。
缺點:代碼空間較大;庫變更時應用程序需要重新編譯。
(2)動態庫:動態庫沒有被打包到應用程序中,只有在程序調用庫函數的時候才會調用動態庫。
優點:程序體積小;庫變更時程序不需要重新編譯(注意:函數接口變化,需要重新編譯)。
缺點:使用相對麻煩(需要解決動態加載問題);執行慢;發布應用程序時需要發布庫。
總結
以上是生活随笔為你收集整理的Linux学习:静态库和动态库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习:gcc 编译其他常用参数
- 下一篇: Linux学习:makefile介绍