日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux动态库和静态库比较

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux动态库和静态库比较 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?Linux動態庫和靜態庫比較文件預覽


文件目錄樹如下,如你所見,非常簡單。
?? 1. libtest/
?? 2. |-- lt.c
?? 3. |-- lt.h
?? 4. `-- test.c

#lt.c
?? 1.
?? 4.
?? 5. #include
?? 6.
?? 7. void myprint(void)
?? 8. {
?? 9.?? printf("Linux library test!/n");
?? 10. }

# lt.h
?? 1.
?? 4.
?? 5. void myprint(void);

#test.c
?? 1.
?? 4.
?? 5. #include "lt.h"
?? 6.
?? 7. int main(void)
?? 8. {
?? 9.?? myprint();
10.?? return 0;
11. }

先看靜態庫
首先做成靜態庫 liblt.a 。
?? 1. $ gcc -o lt.o -c lt.c
?? 2. $ ar cqs liblt.a lt.o

再者,鏈接,
?? 1. $ gcc test.o liblt.a -o test

這個時候再來看他的引用庫情況。
?? 1. $ ldd test
?? 2.???????? linux-gate.so.1 => (0xffffe000)
?? 3.???????? libc.so.6 => /lib/libc.so.6 (0xb7e29000)
?? 4.???????? /lib/ld-linux.so.2 (0xb7f6e000)

動態庫
做成動態庫 liblt.so 。
?? 1. $ gcc -o lt.o -c lt.c
?? 2. $ gcc -shared -Wall -fPIC -o liblt.so lt.o

-shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執行文件
-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

-L.:表示要連接的庫在當前目錄中
-ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱
LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。

鏈接方法I,拷貝到系統庫里再鏈接,讓gcc自己查找

?? 1. $ sudo cp liblt.so /usr/lib
?? 2. $ gcc -o test test.o -llt
這里我們可以看到了 -llt 選項,-l[lib_name] 指定庫名,他會主動搜索
lib[lib_name].so。這個搜索的路徑可以通過 gcc --print-search-dirs來查找。

鏈接方法II,手動指定庫路徑

?? 1. $ cc -o test test.o -llt -B /path/to/lib

這里的-B 選項就添加 /path/to/lib 到gcc搜索的路徑之中。這樣鏈接沒有問題但是方法II中手動鏈接好的程序在執行時候仍舊需要指定庫路徑(鏈接和執行是分開的)。需要添加系
統變量 LD_LIBRARY_PATH :


?? 1. $ export LD_LIBRARY_PATH=/path/to/lib

這個時候再來檢測一下test程序的庫鏈接狀況(方法I情況)

?? 1. $ ldd test
?? 2.???????? linux-gate.so.1 => (0xffffe000)
?? 3.???????? liblt.so => /usr/lib/liblt.so (0xb7f58000)
?? 4.???????? libc.so.6 => /lib/libc.so.6 (0xb7e28000)
?? 5.???????? /lib/ld-linux.so.2 (0xb7f6f000)

恩,是不是比靜態鏈接的程序多了一個 liblt.so ?恩,這就是靜態與動態的最大區別,靜態情況下,他把庫直接加載到程序里,而在動態鏈接的時候,他只是保留接口,將動態庫與程序代碼獨立。這樣就可以提高代碼的可復用度,和降低程序的耦合度。

另外,運行時,要保證主程序能找到動態庫,所以動態庫一般發布到系統目錄中,要么就在跟主程序相對很固定的路徑里,這樣不管主程序在本機何時何地跑,都能找得到動態庫。而靜態庫只作用于鏈接時,運行主程序時,靜態庫文件沒存在意義了。

?

總結

以上是生活随笔為你收集整理的Linux动态库和静态库比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。