靜態(tài)庫的文件名 libxxx.a -->對應windows的.lib文件做靜態(tài)庫的命令:
創(chuàng)新互聯(lián)建站是一家專業(yè)從事做網(wǎng)站、成都網(wǎng)站建設、網(wǎng)頁設計的品牌網(wǎng)絡公司。如今是成都地區(qū)具影響力的網(wǎng)站設計公司,作為專業(yè)的成都網(wǎng)站建設公司,創(chuàng)新互聯(lián)建站依托強大的技術實力、以及多年的網(wǎng)站運營經(jīng)驗,為您提供專業(yè)的成都網(wǎng)站建設、營銷型網(wǎng)站建設及網(wǎng)站設計開發(fā)服務!
使用靜態(tài)庫:
注意:-L的作用是告訴gcc你的libxxx.a放在了哪個目錄里;-l的作用是告訴gcc使用哪個靜態(tài)庫。
舉個例子,目錄結果如下:
head.h
add.c
sub.c
mul.c
執(zhí)行后,在src目錄下生產(chǎn)了add.o,sub.o,mul.o三個文件
執(zhí)行后,在lib文件夾出現(xiàn)了libCalc.a
main.c
最后目錄結構如下:
動態(tài)庫的文件名 libxxx.so(對應windows的.dll文件) 編譯時,需要加【-fPIC】選項。它的作用是,編譯出與位置無關的代碼。因為動態(tài)庫在加載到下圖的共享庫區(qū)的時候,不一定加載到哪個位置,所以加了-fPIC后,就記錄了每個函數(shù)相對于這個動態(tài)庫頭地址的偏移,加載后動態(tài)庫在內存里的頭地址是知道的,又知道了每個函數(shù)相對于頭的偏移量,自然而然地就能夠找到每個函數(shù)在內存里的位置了。
做靜態(tài)庫的命令(-shared):
用【ldd】命令查看編譯出來的可執(zhí)行文件文件
結果如下:
發(fā)現(xiàn)【libCalc.so => not found】
把做好的動態(tài)庫libCalc.so拷貝到【/lib】或者【/usr/lib】下,也可以用ln做軟硬連接:把當前目錄下的lib目錄下的libCalc.so鏈接到/lib下
結果如下:
發(fā)現(xiàn)軟連接是紅色的,也就是不能使用的意思,錯誤在于./lib/libCalc.so這個路徑是不存在的,原因在于上面的命令使用的是相對路徑,改成絕對路徑就OK了,命令如下:
結果如下:
發(fā)現(xiàn)軟連接是綠色的了,說明庫可以使用了。
再用【ldd】命令查看編譯出來的可執(zhí)行文件文件 ldd a.out, 結果如下:
但是這種方法不推薦使用。理由是,放在了系統(tǒng)的動態(tài)庫目錄里,容易和別的庫重復,發(fā)生沖突。
首先編輯/etc/ld.so.conf文件,添加你自己的庫的路徑 然后,執(zhí)行:【sudo ldconfig】,就OK了。
靜態(tài)庫:
編譯的時候,直接把靜態(tài)庫的代碼直接編譯到目標文件
執(zhí)行速度快,不需要在執(zhí)行的時候加載動態(tài)庫
庫文件修改后,必須重新編譯使用庫的代碼