Linux 關於靜態庫和動態庫

2021-09-09 09:12:56 字數 1999 閱讀 4703

為什麼要使用庫?

如何使用庫:

靜態庫與動態庫

查詢c標準靜態庫:

find /usr/lib -name libc.a
查詢c標準動態庫:

find /usr/lib -name libc.so*
如何給別人提供乙個靜態庫:首先要自己提供一套方法,然後打包。

就以add函式和sub函式為例,說明如何給別人提供乙個靜態庫:

標頭檔案**:

#pragma once

#include int myadd(int x,int y);

#pragma once

#include int mysub(int x,int y);

.c檔案**:

#include "add.h"

int myadd(int x,int y)

#include "sub.h"

int mysub(int x,int y)

測試檔案:

#include #include "add.h"

#include "sub.h"

int main()

使用gcc -c編譯生成add.c和sub.c的目標檔案add.o和sub.o

將add.o和sub.o一起打包生成靜態庫

最後將生成的靜態庫檔案和標頭檔案放在測試檔案中,就可以使用該靜態庫了。

在使用時,還要用到一下幾個命令:

gcc -i  //查詢標頭檔案

gcc -l //查詢庫檔案

gcc -lmath//-l是鏈結哪個庫,後面緊跟的是庫名

gcc -static//鏈結的靜態庫

gcc -ldd //查詢可執行程式所鏈結的庫

如何生成動態庫?還是以add和sub為例說明,如何生成動態庫:

在**和測試用例寫好之後,使用

shared//表示生成共享庫格式

fpic//產生位置無關碼(可以隨意載入,與位置無關)

生成動態庫:

使用動態庫

動態庫在使用之前需要設定環境變數:

export ld_library_path=.  //設定環境變數

ld_library_path是程式查詢時的預設搜尋路徑

這裡需要設定環境變數的原因是:

編譯器只負責編譯,執行**是作業系統的任務,我們使用命令列寫的查詢路徑只有編譯器知道,並沒有告訴作業系統,所以此時還需設定一下環境變數,否則系統使用預設的libc.so

為了驗證我們是否成功使用動態庫,此時還可以檢視一下:

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...