lib和dll的區別,生成以及使用詳解

2021-10-22 18:59:50 字數 2826 閱讀 9149

靜態庫:在鏈結步驟中**,聯結器將庫檔案取得所需的**,複製到生成的可執行檔案中,這種庫叫做靜態庫**,其特點是可執行檔案中包含了庫**的乙份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令全部被直接包含在最終生成的exe檔案中。在vs中新建生成靜態庫的工程,編譯生成成功後,只產生乙個.lib檔案。

動態庫:動態庫鏈結是乙個包含可由多個程式同時使用的**和資料的庫,dll不是可執行的檔案,動態庫提供一種方法,使程序可以呼叫不屬於其可執行**的函式。函式的可執行**位於乙個dll中,該dll中包含乙個或者多個已經被編譯,鏈結並使用它們的程序分開儲存的函式,在vs中新建生成動態庫的工程,編譯成功後,產生乙個.lib和乙個.dll檔案

靜態庫的lib:該lib包含函式的**本身(包括函式的索引,也包括實現),在編譯 的時候將**加入程式當中

動態庫的lib:該lib包含了函式所在的dll檔案和檔案中函式位置的資訊,函式實現**由執行的時候載入在程序空間中dll提供,總之,lib是編譯的時候用到的,如果完成源**的編譯,只需要lib,如果要使得動態庫的程式執行起來,只需要dll

靜態庫在程式編譯的時候會被鏈結到目標**中,程式執行的時候不需要該靜態庫

靜態庫特點

靜態庫對函式庫的鏈結是放在編譯期完成的,程式在執行的時候與函式庫再無瓜葛,移植方便。

是靜態庫對程式的更新,部署和發布會帶來麻煩,如果靜態庫更新,所有使用它的應用程式程式都需要重新編譯,發布給使用者。

動態庫特點

動態庫把一些庫函式的鏈結載入推遲到程式執行的時期,可以實現程序之間的資源共享。

將實現程序之間的資源共享,將一些程式公升級變得簡單。甚至可以真正做到鏈結載入完全由程式**中控制(顯示呼叫)

gcc -o 與gcc -c的區別,gcc -o是將.c原始檔編譯成乙個可執行的二進位制**,這包括呼叫gcc內的一部分真正的c編譯器,以及呼叫gnu c編譯器的輸出中實際可執行的**的外部gnu彙編器和鏈結工具,而-c是使用gnu彙編器將原始檔轉換為目標**之後就結束,在這種情況下聯結器並沒有被執行,所以輸出的目標檔案不會包含作為linux程式在被裝載和執行的時候所必須的資訊。

linux 動態庫的命名與製作:

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

建立動態庫.so可以分為兩步:

最終會得到動態鏈結庫.so檔案

使用動態鏈結庫

引用動態鏈結庫,和靜態庫一樣,在編譯的時候制定動態鏈結庫就好

gcc main.c -l. -lmyhello.

-l. 代表動態庫在當前路徑下; -l後跟的是動態鏈結庫的名字。和靜態一樣,可以捨去字首(lib和字尾.so)

參考:實戰

簡單的介面:

max.h:

#ifndef max_h_

#define max_h_

#ifdef _cplusplus

extern

"c"/* code */

#endif

//_cplusplus

#endif

//max_h_

max.cpp

#include

"max.h"

#include

intmax(

int a,

int b)

然後在此處寫cmakelists.txt

set

(libmax_src max.cpp)

add_library

(max shared $

)

然後cmake .

make就能得到.so

然後編寫main.cpp 也就是呼叫介面的。

#include

#include

"max.h"

intmain

(int argc,

char

const

*ar**)

然後再編寫乙個cmake

# 設定cmake的最小版本

cmake_minimum_required

(version 2.8.8)

# 專案名稱

project

(main)

# 設定c++編譯器,設定變數路徑

set(cmake_cxx_standard 11

)# 專案中的include路徑

include_directories

(lib)

# 專案中的lib路徑

link_directories

(lib)

add_executable

(main main.cpp)

#鏈結libmax.so

target_link_libraries

(main max)

然後編譯:

cmake …

make

就能得到結果

lib和dll的區別,生成

首先介紹下靜態庫 靜態鏈結庫,lib檔案 動態庫 動態鏈結庫,dll檔案 的概念,首先兩者都是 共享的方式.靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 缺點就是被多次使用就會有多份冗餘拷貝.即靜態庫中的指令...

lib和dll的區別 生成以及使用詳解

目錄 lib dll介紹 生成動態庫 呼叫動態庫 生成靜態庫 呼叫靜態庫 首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在連線步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種苦稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 ...

lib 和 dll 的區別 生成以及使用詳解

首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最...