C 之lib和dll例項及簡單分析

2021-07-30 11:35:14 字數 2363 閱讀 7087

一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊(入口),**由執行時載入在程序空間中的dll提供,稱為動態鏈結庫dynamic link library。

一種是lib包含函式**本身,在編譯時直接將**加入程式當中,稱為靜態鏈結庫static link library。

共有兩種鏈結方式:

動態鏈結使用動態鏈結庫,程式執行時載入dll;靜態鏈結使用靜態鏈結庫,程式執行前載入lib

(1)lib是編譯時用到的,dll是執行時用到的。如果要完成源**的編譯,只需要lib;如果要使動態鏈結的程式執行起來,只需要dll。

如果**裡dll和lib同時存在,而且有關聯:

(1)如果有dll檔案,那麼lib一般是一些索引資訊,記錄了dll中函式的入口和位置,dll中是函式的具體內容;如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib檔案,在執行程式時不需要再掛動態庫,缺點是導致應用程式比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程式才行。

(2)動態鏈結的情況下,有兩個檔案:乙個是lib檔案,乙個是dll檔案。lib包含被dll匯出的函式名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到dll檔案。在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中相應函式**的位址,從而節省了記憶體資源。dll和lib檔案必須隨應用程式一起發行,否則應用程式會產生錯誤。如果不想用lib檔案或者沒有lib檔案,可以用win32 api函式loadlibrary、getprocaddress裝載。

注意:應用程式如何找到dll檔案?

使用loadlibrary顯式鏈結,那麼在函式的引數中可以指定dll檔案的完整路徑;如果不指定路徑,或者進行隱式鏈結,windows將遵循下面的搜尋順序來定位dll:

(1)包含exe檔案的目錄

(2)工程目錄

(3)windows系統目錄

(4)windows目錄

(5)列在path環境變數中的一系列目錄

一:lib建立和使用

1.生成lib步驟,新建專案-》控制台-》靜態庫

#ifndef _static_lib_h_

#define _static_lib_h_

int add(int, int);

#endif

#include "stdafx.h"

#include "add.h"

int add(int a, int b)

2.把lib拷貝到main檔案中,建立乙個.h檔案

#include

#include "add.h"

using

namespace

std;

#pragma comment(lib, "lib.lib")

int main(int argc, char *argv)

#ifndef _static_lib_h_

#define _static_lib_h_

int add(int, int);

#endif

二:dll隱式(生成lib和dll,並且使用)

總的檔案包括專案一和專案二。

1.生成dll和lib步驟,新建專案-》控制台-》dll建立

專案一dll(生成dll和lib):

extern "c" __declspec(dllexport) int add(int,int);

#include "stdafx.h"

#include "add.h"

int add(int x,int y)

// dllmain.cpp : 定義dll 應用程式的入口點。

#include "stdafx.h"

boolapientry dllmain(hmodule hmodule,

dword ul_reason_for_call,

lpvoid lpreserved

)return true;

}

2.使用dll和lib,將上一步生成的dll和lib分別放入debug(或者release資料夾裡面,取決於你的編譯方式),lib放入和main檔案一起。還需要加入add.h.

專案二testtest2(使用lib和dll):add.h和main.cpp

extern

"c" __declspec(dllexport) int add(int,int);

#include

#include

#include "add.h"

#pragma comment(lib, "dll.lib")

int main()

C 生成和使用dll和lib

dll和lib 動態鏈結庫 dll 是乙個可以被其他應用程式共享的程式模組,其中封裝了一些可以被共享的例程和資源。和可執行檔案 exe 非常類似,區別在於dll中雖然包含了可執行 卻不能單獨執行,而應由windows應用程式直接或間接呼叫。靜態鏈結庫 lib 包含函式 本身,在編譯時直接將 加入程式...

C 載入lib和dll的方法

c 載入lib的方法 方法1 直接新增lib專案的引用 方法2 在屬性 聯結器 輸入 裡新增要使用的lib,在聯結器 常規 附加庫目錄新增lib的目錄 c 載入dll的方法 參考 一 先介紹dll匯出要使用的函式的方法。dll中匯出函式有兩種方法 1 在函式宣告中加上 declspec dllexp...

C 引用Lib和Dll的方法總結

1.什麼是靜態連線庫lib,什麼是動態鏈結庫 dll 靜態鏈結庫與動態鏈結庫都是共享 的方式,都是二進位制格式的 2.靜態鏈結庫lib和動態鏈結庫dll的區別 若採用靜態鏈結庫,lib 中的指令都全部被直接包含在最終生成的 exe 檔案中了。而動態動態鏈結庫則不必被包含在最終 exe 檔案中,exe...