Linux靜態庫 動態庫的生成和使用

2021-10-24 22:19:48 字數 1732 閱讀 8629

當要把程式給別人,但不想讓他看到原**的時候,可以將程式編譯成「庫」發給他。相當於對程式進行了加密,別人可以使用,但看不到裡面的內容。

一、靜態庫與動態庫?

①.靜態庫在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫。

②.動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。

靜態庫優點:

缺點:1.鏈結時完整地拷貝至可執行檔案中,被多次使用就有多份冗餘拷貝,浪費記憶體空間。

2.更新、部署、發布麻煩。

缺點:1.載入速度比靜態庫慢

2.發布程式需要提供依賴的動態庫

動態庫的製作和使用

(1)命名規則

靜態庫檔案的命名方式是 lib***.so ,庫名前加 lib ,字尾用 .so ,***為靜態庫名

(2)製作步驟

將原始檔生成 .so gcc -shared -fpic a.c b.c -o lib***.so

-shared 指定生成動態庫

-fpic 標準,fpic 選項作用於編譯階段,在生成目標檔案時就得使用該選項,以生成位置無關的**。

(3)庫的使用

gcc main.c -l***.c -l ./ -o mainprody

sudo cp lib***.so /usr/lib/

./mainprody

可以指定該程式執行時候,在ld_library_path 所指定的路徑去找庫檔案 環境變數臨時的

export ld_library_path="/home/pi/back/test" .so 的pwd:/home/pi/back/test

編寫乙個指令碼

vi start.sh

export ld_library_path="/home/pi/back/test"

./mainprody

chmod +x start.sh

引用動態庫,怎麼指定動態庫的位置

1.一起編譯、鏈結

gcc -o test man.c sub.c

2.分開編譯、同一鏈結

gcc -c -o main.o main.c

gcc -c -o sub.o sub.c

gcc -0 test main.o sub.c

3.製作使用動態庫

製作、編譯:

gcc -c -o main.o main.c

gcc -c -o sub.o sub.c

gcc -shared -o libsub.so sub.o sub.2.o (可以使用多個.o生成動態庫)

gcc -o test main.o -lsub -l ./(-l /libsub.so/所在目錄/)

執行:先把libsub.so放到pc或板子上的/lib目錄,然後執行test程式。

如果不想把libsub.so放到/lib,也可以放到某個目錄比如/a,然後如下執行:

cp libsub.so /lib

export ld_library_path=$ld_library_path:/a

./test

4.製作、使用靜態庫

gcc -c -o main.o main.c

gcc -c -o sub.o sub.c

ar crs lib sub.a sub.0 sub2.o (可以使用多個.o生成的靜態庫)

gcc -o test main.0 libsub.a (如果.a不在當前目錄下,需要制定它的絕對路徑和相對路徑)

linux 靜態庫和動態庫生成

靜態庫 ar rcs lib a xx1.o xx2.o 生成靜態庫 c 建立乙個庫 s 建立目標檔案索引,在建立較大的庫時,能加快時間 rablib lib a 為庫檔案建立索引。ar t lib a 檢視庫檔案內所含目標檔案名字 ar tv lib a 檢視庫檔案內所含目標檔案,顯示檔名 時間 ...

Linux靜態庫和動態庫的生成

建立庫 靜態庫 在編譯時就拷貝到應用程式中,因此當多個應用程式同時引用乙個靜態庫時,記憶體中將會有呼叫函式的多個副本。優點 節省編譯時間。動態庫 在程式開始執行後呼叫庫函式時才被載入,被調函式的央存中只有乙個副本,並且動態庫可以在程式執行期間釋放動態庫所占用的記憶體,騰出空間供其他程式使用。建立靜態...

Linux 如何生成靜態庫和動態庫

1 linux下的庫 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同。靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此 體積較小。2 庫存在的意義 庫是別人寫好的現有的,成熟的,可以復用的 你可以使用但...