庫的製作與使用
介紹
庫是一種可執行的二進位制檔案, 是編譯好的程式碼。 使用庫可以提高開發效率。 在 Linux 下有靜態庫和動態庫。 因此編譯出來的體積就比較大。
靜態庫在程式編譯的時候會被連結到目的碼裡面。 所以程式在執行的時候不再需要靜態庫了。 因此編譯出來的體積就比較大。 以 lib 開頭, 以.a 結尾
動態庫(動態庫也叫共享庫) 在程式編譯的時候不會被連結到目的碼裡面, 而是在程式執行的時候被載入的。 所以程式在執行的時候需要動態庫了。 因此編譯出來的體積就比較小。 以 lib 開頭, 以.so 結尾。
靜態庫的製作步驟:
1 編寫或準備庫的原始碼
2 將原始碼.c 檔案編譯生成.o 檔案
3 使用 ar 命令建立靜態庫
4 測試庫檔案
實驗: 靜態庫的製作
新建 mylib.c 檔案, 編輯內容如下所示:
#include<stdio.h>
void mylib(void);
void mylib(void)
{
printf("This is mylib\n");
}
cr是建立和覆蓋的意思
lib開頭.a結尾
libmylib.a: 庫檔名
mylib: 庫名
使用這個靜態庫
test.c
#include<stdio.h>
void mylib();
int main(int argc, char const *argv[])
{
mylib();
return 0;
}
-l+去掉lib字首和.a字尾的庫名
-L+該庫檔名所在的路徑
動態庫製作步驟:
1 編寫或準備庫的原始碼
2 將原始碼.c 檔案編譯生成.o 檔案
3 使用 gcc 命令建立動態庫
4 測試庫檔案
新建 mylib.c 檔案, 編輯內容如下所示:
#include<stdio.h>
void mylib(void);
void mylib(void)
{
printf("This is mylib\n");
}
-fpic: 生成位置無關的程式碼(產生的程式碼中,沒有絕對地址,全部使用相對地址)
-shared: 生成動態庫
test.c
#include <stdio.h>
void mylib(void);
int main(void)
{
mylib();
return 0;
}
在動態庫使用是, 系統會預設去/lib, /usr/lib 目錄下去查詢動態函式庫, 如果我們使用的庫不在裡面,
就會提示錯誤。 解決這個問題有三種方法。
解決方法:
第一種方法:
將生成的動態庫複製到/lib 或者/usr/lib 裡面去, 因為系統會預設去這倆個路徑下尋找。
第二種方法:
把我們的動態庫所在的路徑加到環境變數裡面去, 比如我們動態庫所在的路徑為/home/test, 我們就可以這樣新增, 但是這種方法只在當前設定的視窗有效。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/samba/linux/13
我們加入環境後, 執行 a.out,如下圖所示:
只對當前命令視窗有效
第三種方法:
修改 ubuntu 下的配置檔案/etc/ld.so.conf, 我們在這個配置檔案裡面加入動態庫所在的位置, 然後使用命令 ldconfig 更新目錄。
我們輸入以下命令編輯/etc/ld.so.conf 檔案, 如下圖所示:
修改完檔案儲存退出, 輸入 ldconfig 更新目錄。 執行測試如下圖所示: