参考
静态链接 VS 动态链接
静态库 VS 动态库
实验环境
OS:Windows10 企业版
IDE:Visual Studio 2017旗舰版
前言
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
静态库、动态库主要考虑点
1、共享
2、知识产权保护
创建静态库
代码演示
Test_Lib.h
1 #pragma once 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 int Add(int a, int b); 6 int Sub(int a, int b); 7 int Mul(int a, int b); 8 float Div(int a, int b); 9 int Mod(int a, int b); 10 int Square(int a);
Tets_lib.cpp
1 #include<iostream> 2 #include"Test_Lib.h" 3 #include<string> 4 using namespace std; 5 int Add(int a, int b) 6 { 7 return a + b; 8 } 9 int Sub(int a, int b) 10 { 11 return a - b; 12 } 13 int Mul(int a, int b) 14 { 15 return a * b; 16 } 17 float Div(int a, int b) 18 { 19 if (0 == b) 20 { 21 string str("除数为零错误"); 22 throw overflow_error(str); 23 } 24 return a / b; 25 } 26 int Mod(int a, int b) 27 { 28 if (0 == b) 29 { 30 string str("除数为零错误"); 31 throw overflow_error(str); 32 } 33 return a % b; 34 } 35 int Square(int a) 36 { 37 return a * a; 38 }
编译后生成静态库lib文件
使用静态库
创建Win32控制台空项目,测试源码
1 #include<iostream> 2 #include"Test_lib.h" 3 using namespace std; 4 5 #pragma comment(lib,"Project3.lib") 6 int main() 7 { 8 int a = 10; 9 int b = 3; 10 cout << Add(a, b) << endl; 11 cout << Mul (a, b) << endl; 12 13 }
输出结果
注意,第5行显示引入静态链接库。除了这种做法意外还可以在连接器中指定,见下图
一次编译到处运行
稍微修改下之前的测试静态库代码,源码如下
1 #include<iostream> 2 #include"Test_lib.h" 3 using namespace std; 4 5 //#pragma comment(lib,"Project3.lib") 6 int main() 7 { 8 int a = 10; 9 int b = 3; 10 cout << Add(a, b) << endl; 11 cout << Mul (a, b) << endl; 12 system("pause"); 13 }
编译完生成exe文件后,可以拷贝到任何位置,都可以直接执行。这是静态库的一大好处,也是坏处。
坏处就是稍微一点更改都要重新编译。这对于软件发布而言是很不友好的。