静态库的制作与使用 静态链接 VS 动态链接 静态库 VS 动态库

参考

静态链接 VS 动态链接

静态库 VS 动态库

实验环境

OS:Windows10 企业版

IDE:Visual Studio 2017旗舰版

前言

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

静态库、动态库主要考虑点

1、共享

2、知识产权保护

创建静态库

扫描二维码关注公众号,回复: 3314494 查看本文章

代码演示

Test_Lib.h

 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 }
View Code

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 }
View Code

编译后生成静态库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 }
View Code

输出结果

注意,第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 }
View Code

编译完生成exe文件后,可以拷贝到任何位置,都可以直接执行。这是静态库的一大好处,也是坏处。

坏处就是稍微一点更改都要重新编译。这对于软件发布而言是很不友好的。

猜你喜欢

转载自www.cnblogs.com/kelamoyujuzhen/p/9694131.html
今日推荐