Linux的靜態庫和動態庫

2021-10-13 20:39:45 字數 2072 閱讀 3196

靜態庫命名規則

靜態庫檔案命名為lib***.a

lib為固定字首

***為庫的名字,庫名字內容長度自己定。注意庫的名字和庫檔案名字是兩個東西

.a為固定的庫檔案字尾

靜態庫的製作與使用

靜態庫**的編寫

class

cmath

;

將**檔案編譯成目標檔案.o

g++ -c math.cpp
注意帶引數-c,否則直接編譯為可執行檔案

通過ar工具將目標檔案打包成.a靜態庫檔案

ar -crv libmath.a matho
生成靜態庫libmath.a

使用靜態庫

#include

"math.h"

#include

using

namespace std;

intmain()

linux下使用靜態庫,只需要在編譯的時候,指定靜態庫的搜尋路徑(-l選項)、指定靜態庫名(不需要lib字首和.a字尾,-l選項)

g++ test.cpp -l./ -lmath -o test
-l:表示要連線的庫所在目錄

linux動態庫的命名規則

動態鏈結庫的名字形式為 lib***.so,字首是lib,字尾名為「.so」

動態庫的**編寫

class

cmath

;

建立動態庫

生成目標檔案,此時要加編譯器選項-fpic

g++ -fpic -c math.cpp
-fpic 建立與位址無關的編譯程式(pic,position independent code),是為了能夠在多個應用程式間共享

生成動態庫,此時要加鏈結器選項-shared

g++ -shared -o limath.so math.o
其實上面兩個步驟可以合併為乙個命令:

g++ -fpic -shared -o libmath.so math.cpp
使用動態庫

#include

"math.h"

#include

using

namespace std;

intmain()

g++ test.cpp -l./ -lmath -o test
執行

sh-4.2# ./test 

./test: error while loading shared libraries: libmath.so: cannot open shared object file: no such file or directory

在執行的時候是如何定位共享庫檔案的呢?

當系統載入可執行**時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑。此時就需要系統動態載入器(dynamic linker/loader)。

對於elf格式的可執行程式,是由ld-linux.so*來完成的,它先後搜尋elf檔案的 dt_rpath段—環境變數ld_library_path—/etc/ld.so.cache檔案列表—/lib/,/usr/lib 目錄找到庫檔案後將其載入記憶體。

如何讓系統能夠找到它:

l 如果安裝在/lib或者/usr/lib下,那麼ld預設能夠找到,無需其他操作。

l 如果安裝在其他目錄,需要將其新增到/etc/ld.so.cache檔案中,步驟如下:

n 執行ldconfig ,該命令會重建/etc/ld.so.cache檔案

我們將建立的動態庫複製到/usr/lib下面,然後執行測試程式

#include ,提供了下面幾個介面:

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