一、靜態庫的編譯
靜態庫的編譯過程如下:
1、編譯成目標文件
這里有一個可選項-static,調用格式:gcc -c -static 代碼文件名.c
2、歸檔成靜態庫
A、歸檔的工具是ar工具,使用ar -r可以將文件歸檔成靜態庫,調用格式:ar -r 靜態庫文件 被歸檔的文件
例如:我們這有兩個C文件,分別為test1.c和test2.c
首先我們將它編譯成目標文件:gcc -c -static test1.c
gcc -c -static test2.c
此時會產生兩個文件,分別為test1.o和test2.o
然后我們將它們歸檔:ar -r libdemo1.a test1.o test2.o,此時的靜態庫文件就是demo1.a。注意demo1是庫名,前面加上lib是命名規范。
B、使用nm工具可以查看已有函數符號表,使用格式為:nm 靜態庫或者動態庫或者目標文件或者執行文件
?
3、使用靜態庫
使用格式:gcc 代碼文件名.c ??l靜態庫名 -L庫所在目錄
例如:這里有一個main.c文件和上面的libdemo1.a靜態庫,現在我們想編譯它,則:
gcc main.c -omain -ldemo1 -L.
4、靜態庫的規范和約定
庫命名規則:lib庫名.a ? //此處是指在lib后面直接加上庫名,如上例中的libdemo1.a
庫使用規則:-l庫名 //此處是指在-l后面直接加上庫名
-L庫所在目錄 ? //此處是指在-L后面直接加上庫所在目錄,如在當前目錄,就是-L.
?
5、采用庫的方式管理代碼優點:容易組織代碼、復用、保護代碼版權
6、靜態庫的靜態的含義:編譯好的程序運行的時候不依賴庫,庫作為程序的一部分編譯連接。
7、靜態庫本質:就是目標文件集合(歸檔)
?
二、動態庫的編譯(Linux中稱為共享庫)
1、動態庫和靜態庫的區別
A、動態庫是可以執行,靜態庫不能執行。
B、動態庫不會成為程序的一部分,而 靜態庫在程序的鏈接階段被復制到了程序中
2、動態庫的編譯
使用-c -fpic,其中-fpic可選
3、動態庫的連接
使用-shared
例如:有兩個C文件,分別為test3.c,test4.c
分別對他們進行編譯:gcc -c -fpic test3.c
gcc -c -fpic test4.c
產生test3.o和test4.o,然后對他們連接:gcc -shared -olibdemo2.so test3.o test4.o
4、使用動態庫
使用格式:gcc 代碼?? -l庫名 -L動態庫所在路徑
例如:有一個代碼文件main2.c,要使用上面產生的動態庫demo2,則:
gcc main2.c -ldemo2 -L. -omain
5、動態庫的命名規則
lib庫名.so
6、動態庫的加載
A.找到動態庫
???? ???B.加載動態庫到內存
? ?????C.映射到用戶的內存空間
7、系統對動態庫查找規則
??A、在/lib中查找
?????B、在/usr/lib中查找
?????C、到環境變量LD_LIBRARY_PATH指定的路徑中查找
8、動態庫的使用工具
ldd? 察看程序需要調用的動態庫,當然,ldd只能查看可執行文件
readelf -h 查看執行程序頭.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
