VS2015 動態鏈結庫 靜態鏈結庫

2021-08-10 13:19:47 字數 2310 閱讀 8599

首先介紹一下靜態庫(靜態鏈結庫)、動態庫(動態鏈結庫)的概念,首先兩者都是**共享的方式。

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

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

那麼上述靜態庫和動態庫中的lib有什麼區別呢?

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

動態庫中的lib:該lib包含了函式所在的dll檔案和檔案中函式位置的資訊(索引),函式實現**由執行時載入在程序空間中的dll提供

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

一.動態鏈結庫

1.建立動態鏈結庫

<2>建立標頭檔案my.h my.cpp

標頭檔案:

#pragma once

#ifdef mydll_exports

#define mydll_api __declspec(dllexport)

#else

#define mydll_api __declspec(dllimport)

#endif

#include #include using namespace std;

class mydll_api goods

; // 整數加法和乘法

int add(int a, int b);

int mul(int c, int d);

cpp檔案:

#include "goods.h"  

goods::goods()

{}goods::~goods()

{}int goods::setname(string name)

int goods::setnum(int num)

int goods::setperunit(int perunit)

int goods::printinfo()

int goods::getcost()

int add(int a, int b)

int mul(int c, int d)

<3>生成解決方案,解決方案生成my.dll 和my.lib

2.使用動態鏈結庫

隱式鏈結 需要.h檔案,dll檔案,lib檔案

(1)將dll放到工程的工作目錄

(2)設定專案屬性--vc++目錄--庫目錄為lib所在的路徑

(4)在原始檔中新增.h標頭檔案

然後就像平常一樣呼叫普通函式、類、變數

二.靜態鏈結庫

1.建立靜態鏈結庫

<2>建立標頭檔案my.h my.cpp

標頭檔案:

#ifndef _mylib_h_

#define _mylib_h_

void fun(int a);

extern int k;

class testclass

;#endif

cpp檔案:

#include "stdafx.h"

#include "lib.h"

#include void fun(int a)

{ std::cout《編譯工程後就會生成乙個.lib檔案

2.使用靜態庫

需要.h檔案,lib檔案

(1)設定專案屬性--vc++目錄--庫目錄為lib所在的路徑

(3)在原始檔中新增.h標頭檔案

然後就像平常一樣呼叫普通函式、類、變數,舉例如下:

#include #include "lib.h"

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

int main()

{ fun(4);

std::cout<

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...