VS2015 動態鏈接庫&&靜態鏈接庫

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

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

動態庫:動態鏈接庫是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。在vs中新建生成動態庫的工程,編譯成功後,產生一個.lib文件和一個.dll文件

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

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

動態庫中的lib:該LIB包含了函數所在的DLL文件和文件中函數位置的信息(索引),函數實現代碼由運行時加載在進程空間中的DLL提供

總之,lib是編譯時用到的,dll是運行時用到的。如果要完成源代碼的編譯,只需要lib;如果要使動態鏈接的程序運行起來,只需要dll


一.動態鏈接庫

1.創建動態鏈接庫

<1>新建項目--win32項目--填寫項目名mydll--確定--下一步--應用程序類型:選擇dll--附加選項:選擇導出符號--完成

<2>創建頭文件my.h my.cpp

頭文件:

#pragma once
#ifdef MYDLL_EXPORTS    
#define MYDLL_API __declspec(dllexport)    
#else    
#define MYDLL_API __declspec(dllimport)    
#endif   

#include <iostream>  
#include <string>  

using namespace std;

class MYDLL_API GOODS
{
public:
	GOODS::GOODS();
	GOODS::~GOODS();

	int setname(string name);

	int setnum(int num);

	int setperunit(int perunit);

	int printinfo();

	int getcost();

private:
	string m_name;
	int m_num;
	int m_perunit;
};  
// 整數加法和乘法  
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)
{
	m_name = name;

	return 0;
}

int GOODS::setnum(int num)
{
	m_num = num;
	return 0;
}

int GOODS::setperunit(int perunit)
{
	m_perunit = perunit;
	return 0;
}

int GOODS::printinfo()
{
	cout << "name: " << m_name << endl;
	cout << "num: " << m_num << endl;
	cout << "perunit: " << m_perunit << endl;

	return 0;
}

int GOODS::getcost()
{
	int cost = m_num*m_perunit;
	return cost;
}

int Add(int a, int b) {
	return a + b;
}
int Mul(int c, int d) {
	return c * d;
}
<3>生成解決方案,解決方案生成my.dll 和my.lib

2.使用動態鏈接庫

調用動態庫:隱式鏈接

隱式鏈接 需要.h文件,dll文件,lib文件

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

(2)設置項目屬性--vc++目錄--庫目錄爲lib所在的路徑

(3)將lib添加到項目屬性--鏈接器--輸入--附加依賴項(或者直接在源代碼中加入#pragma comment(lib, “**.lib”))

(4)在源文件中添加.h頭文件

然後就像平常一樣調用普通函數、類、變量


二.靜態鏈接庫

1.創建靜態鏈接庫

<1>新建項目--win32項目--填寫項目名--確定--下一步--應用程序類型:選擇靜態庫 創建項目後添加.h文件,添加相應的導出函數、變量或類,如下所示

<2>創建頭文件my.h my.cpp

頭文件:

#ifndef _MYLIB_H_
#define _MYLIB_H_

void fun(int a);

extern int k;

class testclass
{
public:
    testclass();
    void print();
};

#endif
cpp文件:

#include "stdafx.h"
#include "lib.h"
#include <iostream>

void fun(int a)
{
    std::cout<<a<<"lib gen\n";
}

int k = 222;

testclass::testclass()
{
    std::cout<<"123\n";
}

void testclass::print()
{
    std::cout<<"this is testcalss\n";
}
<3>編譯工程後就會生成一個.lib文件

2.使用靜態庫

需要.h文件,lib文件

(1)設置項目屬性--vc++目錄--庫目錄爲lib所在的路徑

(2)將lib添加到項目屬性--鏈接器--輸入--附加依賴項(或者直接在源代碼中加入#pragma comment(lib, “**.lib”))

(3)在源文件中添加.h頭文件

然後就像平常一樣調用普通函數、類、變量,舉例如下:

#include <iostream>
#include "lib.h"

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

int main()
{
    fun(4);
    std::cout<<k<<std::endl;
    testclass tc; 
    tc.print();
    return 0;
}






發佈了54 篇原創文章 · 獲贊 29 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章