Linux學習(六) 靜態庫和動態庫

2021-09-02 16:37:08 字數 2387 閱讀 9422

在windows中安裝好的軟體目錄下會看到一大堆以lib,dll字尾的檔案。而且有時候玩遊戲或者執行軟體的時候經常會遇到無法執行,因為缺少×××.dll,而這些就是軟體執行需要的庫,也就是原始碼編譯後的檔案。

本質上說庫是一種可執行的二進位制檔案,可以直接被作業系統載入記憶體執行。

庫有兩種:靜態庫和動態庫。windows平台下的靜態庫以「.lib」為字尾名,動態庫以「.dll」為結尾。linux平台下的靜態庫以「.a」結尾,動態庫以「.so」為結尾。

靜態庫的命名規則:名字分為三部分:字首lib+庫名字+字尾.a

(注意:庫的名字一般為小寫)

為了方便,我們新建乙個數學類:staticmath.h 和 staticmath.cpp

#pragma once

class staticmath

;

#include"staticmath.h"

#include#includeusing namespace std;

staticmath::staticmath()

;

#include"dynamicmath.h"

#includeusing namespace std;

dynamicmath::dynamicmath()

{ cout<< "dynamicmath(void) has been called"動態庫和靜態庫的不同在於,在於新增命令的時候需要加上-fpic。-fpic (位置無關**position-independent code)的使用,會生成 pic **,.so 要求為 pic,以達到動態鏈結的目的,否則,無法實現動態鏈結。

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

g++ -fpic -c dynamicmath.cpp

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

g++ -o libdynamicmath.so -shared dynamicmath.o
這樣就生成了動態庫,將main.cpp修改一下測試:

#include"dynamicmath.h"

#include#includeusing namespace std;

int main(int argc, char* argv)

{ double a = 10;

double b = 20;

cout<

g++ -o main main.cpp -l../dynamiclibrarydir -l dynamicmath

但是執行此時生成的main不並能成功!因為系統無法定位到這個動態庫,而不是程式發現不了。

方法一:(系統級)

將生成的.so檔案拷貝到系統/usr/lib或者/lib資料夾下,再執行即可。

方法二:(臨時辦法)

在執行main前指定執行的庫的路徑為當前路徑

ld_library_path=. ./main
方法三:(makefile)

這個屬於方法二的延伸,為的就是使其自動化一些,在makefile中加入後,就不用每次執行都寫字首了:

main.out: main.cpp dynamicmath.so

g++ main.cpp -l . -l dynamicmath

ld_library_path=. ./main.out

執行結果就是:

最要的區別在於資源的利用上:

但是理論上的區別有很多:

1、二者的不同點在於**被載入的時刻不同。靜態庫在程式編譯過程中會被連線到目標**中,程式執行時將不再需要該靜態庫,因此體積較大。動態庫在程式編譯過程中並不會被連線到目標**中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在,因此**體積較小

2、靜態庫屬於完整意義上的封裝。動態庫並不算完整意義上的封裝,更側重於共享

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

Linux學習總結(六)靜態庫和動態庫的製作

命名格式 1.以lib開頭 2.靜態庫名 3.a結尾 例如 libsort.a 優點 缺點 使用場合 1 得到 o gcc a.c b.c c.c c 2 得到靜態庫libmytest.a ar rcs libmytest.a a.o b.o c.o 就是乙個打包.o檔案的過程 檢視庫中的符號 函式...

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標頭檔案。我們先來回顧一下程式編譯的過程。如下圖 庫 本質乙個目標檔案,這個檔案的字尾有兩種格式,對應兩種庫 缺點是 檔案太大。多次拷貝庫程式,不僅浪費空間,而且檔案體積大 下面實現乙個靜態...