一、linux作業系統支援的函式庫分支
靜態庫:lib***.a,在編譯時就將庫編譯進可執行程式
優點:程式的執行環境中不需要外部的函式庫
缺點:可執行程式大
動態庫:又稱共享庫,lib***.so,在程式執行時將庫載入到可執行程式中
優點:可執行程式小
缺點:程式的執行環境中必須提供相應的庫
函式庫目錄:/lib /usr/lib
二、靜態庫的製作
① 生成目標檔案:gcc -c file.c
② 靜態庫的建立命令 ar
ar -cr libfile.a file.o
-c:crete的意思
-r:replace的意思,表示當插入的模組file.o已經存在libfile.a中,則覆蓋。反之ar顯示乙個錯誤資訊。
③ 操作靜態庫的幾個例項:
情況1:如果從別處得到乙個靜態庫libunknown.a,想知道其中包含哪些模組。
命令--- ar -t libunknown.a
靜態庫的編譯:gcc -o main main.c -l. -lfile 編譯main.c 就會把靜態庫整合到main中。
其中:
-l:指定靜態函式庫的位置供查詢,注意l後面還有個. ,表示靜態庫在當前目錄查詢。
-l:則指定了靜態庫名,由於靜態函式庫的命名方式是lib***.a,其中lib和 .a可以忽略不寫。
④ 示例
三、動態庫的製作
① 生成目標檔案:gcc -c file.c
② gcc -shared -fpic -o libfile.so file.o
-fpic:產生位置無關**
-shared:生成共享庫
用上述命令生成libfile.so動態函式庫。
gcc -o out main.c -l. -lfile
此時還不能立即執行./out ,因為在動態函式庫使用時,會預設在 /usr/lib或 /lib目錄下去查詢動態庫,而此時我們生成的庫不在裡面
③ 示例
第一種方法:
libfile.so方到 /lib 或 /usr/lib中去
第二中方法: 環境變數的方法,假設libsub.so在~/coding/libsotest
執行 export ld_library_path=~/coding/libsotest
echo $ld_library_path 檢視路徑是否新增成功
第三種方法:修改sheel配置指令碼
在/etc/ld.so.conf檔案裡加入我們生成的庫目錄,然後/sbin/ldconfig
/etc/ld.so.conf是乙個非常重要的目錄,裡面存放的是鏈結器和載入器搜尋共享庫時要檢查的目錄,預設是從/usr/lib
或/lib 中讀取,所以想要順利執行,可以把我們庫的目錄加入到這個檔案中並執行/sbin/ldconfig
① 開啟ld.so.conf檔案
② 向檔案中新增路徑
③ 用ldconfig執行sheel指令碼
④ 執行可執行程式
四、靜態庫和動態庫的大小比較
由此可見:
編譯成功後可執行程式,靜態庫比較大,因為這裡**不多,所以看不到有很大差距
Linux靜態庫和動態庫的製作
1.什麼是庫檔案?儲存函式和變數 特點 儲存的函式與變數只能使用但不能看到其實現 2.linux庫檔案 靜態庫 在編譯階段載入 將庫檔案的 載入到原始檔 動態庫 在執行時載入 3.生成可執行檔案存在的區別 優缺點 1 使用靜態庫生成的可執行檔案大於動態庫生成的可執行檔案 程式占用的記憶體較多 2 使...
Linux下製作靜態庫和動態庫
所謂庫檔案,就是一堆函式的集合。一堆函式原始碼的集合 c 一堆二進位制函式 的集合 so 使用者可以呼叫庫裡面的函式,但是沒有辦法看到函式的實現過程。在linux裡面,庫有兩種,一種是靜態庫 lib x.a 另外一種是動態庫 共享庫 lib x.so 例子 libabc.so.0.8 lib 庫的字...
製作靜態庫和動態庫
製作靜態庫的方法 1 把 編譯為目標檔案形式 gcc c liberr.c o liberr.o 2 使用工具ar建立乙個存檔檔案 ar rcs liberr.a liberr.o gcc errtest.c o errtest static l.lerr 製作動態庫的方法 1 首先編譯目標檔案 g...