首先介紹一下靜態庫(靜態鏈接庫)、動態庫(動態鏈接庫)的概念,首先兩者都是代碼共享的方式。
靜態庫:在鏈接步驟中,連接器將從庫文件取得所需的代碼,複製到生成的可執行文件中,這種庫稱爲靜態庫,其特點是可執行文件中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最終生成的 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;
}