28_庫的製作與使用

爱吃冰激凌的黄某某發表於2024-04-10

庫的製作與使用

介紹

​ 庫是一種可執行的二進位制檔案, 是編譯好的程式碼。 使用庫可以提高開發效率。 在 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");
}	

image-20240404185429613

cr是建立和覆蓋的意思

lib開頭.a結尾

libmylib.a: 庫檔名

mylib: 庫名

使用這個靜態庫

test.c

#include<stdio.h>

void mylib();

int main(int argc, char const *argv[])
{
    mylib();
    return 0;
}

image-20240404224758176

-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");
}

image-20240404225110035

-fpic: 生成位置無關的程式碼(產生的程式碼中,沒有絕對地址,全部使用相對地址)

-shared: 生成動態庫

test.c

#include <stdio.h>
void mylib(void);
int main(void)
{
	mylib();
	return 0;
}

image-20240404225149360

image-20240404225153648

​ 在動態庫使用是, 系統會預設去/lib, /usr/lib 目錄下去查詢動態函式庫, 如果我們使用的庫不在裡面,
就會提示錯誤。 解決這個問題有三種方法。

解決方法:

第一種方法:
將生成的動態庫複製到/lib 或者/usr/lib 裡面去, 因為系統會預設去這倆個路徑下尋找。
第二種方法:
把我們的動態庫所在的路徑加到環境變數裡面去, 比如我們動態庫所在的路徑為/home/test, 我們就可以這樣新增, 但是這種方法只在當前設定的視窗有效。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/samba/linux/13

我們加入環境後, 執行 a.out,如下圖所示:

image-20240404230152099

只對當前命令視窗有效

第三種方法:
修改 ubuntu 下的配置檔案/etc/ld.so.conf, 我們在這個配置檔案裡面加入動態庫所在的位置, 然後使用命令 ldconfig 更新目錄。
我們輸入以下命令編輯/etc/ld.so.conf 檔案, 如下圖所示:

image-20240404231512852

image-20240404231423291

修改完檔案儲存退出, 輸入 ldconfig 更新目錄。 執行測試如下圖所示:

image-20240404230313139

相關文章