linux下面的靜態庫和動態庫的建立

2021-07-25 11:09:04 字數 2025 閱讀 5849

由於我們做技術的價值就是核心的**編寫,所以我們一般後期都會把檔案用靜態庫或者動態庫的形式封裝起來,這樣我們只用給標頭檔案和庫檔案這樣就夠了。這使我們的原始碼

得到了一定程度上的保護。

windows上的檔案對比,win上面的lib在linux上面是.a檔案,win上面的.dll檔案在linux上是.so檔案,這是兩個系統中檔案的不同。

大家會基本使用gcc來編譯c語言**。然後他的常見的引數 -o,-c預設大家都是知道的。

ar rcs命令

gcc shared fpic命令

乙個include資料夾他用來存放.h檔案,乙個lib資料夾我們知道庫的資料夾,還有乙個就是src他就是**資料夾。

head.h

#ifndef __head_h_

#define __head_h_

int add(int a, int b);

int sub(int a, int b);

int mul(int a, int b);

int div(int a, int b);

#endif

我就定義了三個函式,分別是加減乘除四種運算,這樣我們做乙個簡單的計算器的的庫。

add.c

#include "head.h"

int add(int a, int b)

sub.c

#include "head.h"

int sub(int a, int b)

mul.c

#include "head.h"

int mul(int a, int b)

div.c

#include "head.h"

int div(int a, int b)

現在我們加減乘除都已經有實現的**了,然後我們進入src這個資料夾中進行.c的檔案的編譯

命令是:gcc *.c -c -i ../include 這句話的意思就是把src下面的所有.c檔案都編譯成.o檔案,執行以後我們可以用ls檢視一下資料夾下都多出了.o檔案。

剛才我們講過有乙個ar 的命令現在我們就派上用場的其命令如下。

ar rsc libmycalc.a *.o 現在我們任然是在src下面,我們這個命令就把所有的.o檔案全部打包成了libmycalc.a檔案了由此我們就打包成了靜態庫。然後我們在src 下面ls檢視一下

發現確實是多了乙個libmycalc檔案,然後我們用mv命令把這個檔案移動到lib,其命令就是mv libmycalc.a ../lib這樣我們就順利的把檔案移動到lib檔案下面。最後一步就是用一

個測試檔案來測試我們的庫檔案。

main.c測試**

#include #include "head.h"

int main(void)

然後儲存vim最後用乙個打包以後的命令進行測試

gcc main.c lib/libmycalc.a -i include

得出sum = 26

測試成功

由於動態庫和靜態庫的區別在於編譯的時候的乙個命令。

我們把src下面的所有.o檔案全部刪除,首先進入src檔案 然後用rm *.o這樣就全部刪除了。

gcc -fpic -c *.c -i ../include

這樣我們就可以看到動態連線的庫檔案生成.o

然後執行命令

gcc -shared -o libmycalc.so *.o -i ../include

然後我們就生成了libmycalc.so

後面的命令就和靜態庫的差不多。

生成庫檔案就兩個方面

1.編譯成.o檔案

2.把編譯好的.o檔案打包成我們需要的so 和 a檔案

linux 靜態庫和動態庫

1.生成方式 靜態庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 然後生成靜態庫 ar rc libstatic.a test.o 共享庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 生成共享庫 gcc fpic shared o libsha...

Linux 靜態庫和動態庫

庫有兩種,一種是靜態鏈結庫,一種是動態鏈結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的include標頭檔案。我們先來回顧一下程式編譯的過程。如下圖 庫 本質乙個目標檔案,這個檔案的字尾有兩種格式,對應兩種庫 缺點是 檔案太大。多次拷貝庫程式,不僅浪費空間,而且檔案體積大 下面實現乙個靜態...

Linux 靜態庫和動態庫

我們指定c程式從 到乙個可執行程式需要經過預處理 編譯 彙編 鏈結。而最後一步鏈結又分為動態鏈結與靜態鏈結。靜態鏈結相當於就是講所要鏈結的庫提前放入鏈結的檔案,這樣子的檔案體積較大,但是可移植性較高。而動態鏈結是在執行的時候才去主動鏈結所需要鏈結的庫,這樣的 體積較小,多個程式共同使用庫的 我們li...