参考

静态链接 VS 动态链接

静态库 VS 动态库

实验环境

OS:Windows10 企业版

IDE:Visual Studio 2017旗舰版

前言

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

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

1、共享

2、知识产权保护

创建静态库

代码演示

Test_Lib.h

 #pragma once
#include<iostream>
#include<string>
using namespace std;
int Add(int a, int b);
int Sub(int a, int b);
int Mul(int a, int b);
float Div(int a, int b);
int Mod(int a, int b);
int Square(int a);

Tets_lib.cpp

 #include<iostream>
#include"Test_Lib.h"
#include<string>
using namespace std;
int Add(int a, int b)
{
return a + b;
}
int Sub(int a, int b)
{
return a - b;
}
int Mul(int a, int b)
{
return a * b;
}
float Div(int a, int b)
{
if ( == b)
{
string str("除数为零错误");
throw overflow_error(str);
}
return a / b;
}
int Mod(int a, int b)
{
if ( == b)
{
string str("除数为零错误");
throw overflow_error(str);
}
return a % b;
}
int Square(int a)
{
return a * a;
}

编译后生成静态库lib文件

使用静态库

创建Win32控制台空项目,测试源码

 #include<iostream>
#include"Test_lib.h"
using namespace std; #pragma comment(lib,"Project3.lib")
int main()
{
int a = ;
int b = ;
cout << Add(a, b) << endl;
cout << Mul (a, b) << endl; }

输出结果

注意,第5行显示引入静态链接库。除了这种做法意外还可以在连接器中指定,见下图

一次编译到处运行

稍微修改下之前的测试静态库代码,源码如下

 #include<iostream>
#include"Test_lib.h"
using namespace std; //#pragma comment(lib,"Project3.lib")
int main()
{
int a = ;
int b = ;
cout << Add(a, b) << endl;
cout << Mul (a, b) << endl;
system("pause");
}

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

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

最新文章

  1. 那些PHP中没有全称的简写
  2. poj上的dp专题
  3. AJAX工作原理及其优缺点
  4. LIstView 滚动 异步 加载更多 mono for android ScrollStateChanged ScrollState.Idle; Fling;TouchScroll
  5. C语言 memset函数盲点
  6. 导入dmp文件时的注意事项
  7. Dialog+NumberPicker
  8. Android权限(转)
  9. 【BZOJ】【1027】【JSOI2007】合金
  10. Spring、Spring事务详解;使用XML配置事务
  11. fastjson过滤不需要的属性
  12. vue 2.0之基础
  13. Windows有点腻了?不如试试Ubuntu.
  14. HBase总结 LSM理解
  15. NumPy 中的集合运算
  16. vue-router 编程式路由
  17. gradle构建时跳过指定tests
  18. jqgrid表头上面再加一行---二级表头
  19. swift的一些知识点(不断完善中)
  20. linux几个命令

热门文章

  1. git切换到某个tag, 从tag切换回当前分支
  2. Java基础教程:枚举类型
  3. SpringBoot学习笔记:单元测试
  4. 通过git命令“六步”提交新项目到码云
  5. Uncaught Error: `setOption` should not be called during main process.
  6. Python 常用包收集
  7. 022 Android .9图片的含义及制作教程
  8. Markdown 语法 (转载)
  9. 08 IO流(五)——文件字符流FileWriter/FileReader
  10. Oracle 11g xe版本---总结1