一、静态链接库的使用

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件。
在VS2015平台上,创建一个静态库(.lib)项目方案,选择【创建项目/Win32/Win32控制台应用程序/静态库(.lib)】,如下图所示,

生成项目后,创建两个项目文件staticdll.cpp和staticdll.h,并添加如下代码,

//staticdll.h
#pragma once
//提供给应用程序使用的add函数声明
//与动态链接库不一样,不需要__declspec(dllexport)前缀
extern "C" int add(int x, int y);//staticdll.cpp
#include "stdafx.h"
#include "staticdll.h"
//提供给应用程序使用的add函数定义
int add(int x, int y)
{return x + y;
}

编译项目,得到对应的静态链接库文件staticdll.lib。
在测试项目中调用静态链接库,需要对应的头文件staticdll.h和对应的静态链接库文件staticdll.lib,调用函数如下,

#include "stdafx.h"
#include <iostream>
using namespace std;
//静态库调用
//头文件和静态库文件路径必须要正确
#include "..\staticdll\staticdll.h"
#pragma comment(lib, "..\\Debug\\staticdll.lib")int main()
{int x = 10;int y = 20;cout << "静态库函数调用:x + y = " << add(x, y) << endl;getchar();return 0;
}

二、动态链接库的使用

动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
在VS2015平台上,创建一个DLL项目方案,选择【创建项目/Win32/Win32控制台应用程序/DLL】。
生成项目后,创建两个项目文件dynamic.cpp和dynamic.h,并添加如下代码,

//dynamic.h
#pragma once
#ifdef DYNAMIC_H_
#define dynamicexport extern "C" __declspec(dllexport)
#else
#define dynamicexport extern "C" __declspec(dllimport)
#endifdynamicexport int add_dll(int x, int y);//dynamic.cpp
#define DYNAMIC_H_
#include "dynamic.h"int add_dll(int x, int y)
{return x + y;
}

编译项目,得到对应的动态链接库文件dynamic.dll和动态链接库对应的导入库文件dynamic.lib。
在测试项目中调用动态链接库,需要对应的头文件dynamic.h和对应的导入库文件dynamic.lib,同时还要将dynamic.dll文件与执行文件exe放在同一个目录下,调用如下,

#include "stdafx.h"
#include <iostream>
using namespace std;
//动态库静态调用
#include "..\dynamic\dynamic.h"
#pragma comment(lib, "..\\Debug\\dynamic.lib")int main()
{int a = 5;int b = 10;cout << "动态库函数静态调用:a + b = " << add_dll(a, b) << endl;getchar();return 0;
}

静态库的调用和动态库的静态调用形式是一样的,动态库还可以采用动态调用,请参考博客:DLL基本应用

三、静态库和动态库的区别

1、 静态链接库的后缀名为lib,动态链接库的导入库的后缀名也为lib。不同的是,静态库中包含了函数的实际执行代码,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息;
2、由于静态库是在编译期间直接将代码合到可执行程序中,而动态库是在执行期时调用DLL中的函数体,所以执行速度比动态库要快一点;
3、 静态库链接生成的可执行文件体积较大,且包含相同的公共代码,造成内存浪费;
4、 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;
5、 DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性,适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

静态链接库和动态链接库的区别相关推荐

  1. 【转载】linux静态链接库与动态链接库的区别及动态库的创建

    这篇文章对于动态库的概念及使用介绍的很不错,故收藏了. 一.引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数 ...

  2. 静态链接库与动态链接库的区别

    (1).静态链接库:在链接阶段(生成可执行文件)将库函数全部载入到可执行文件中,可执行文件中包含了所有的库函数 优点:应用程序可以独立运行: 缺点:如果多次调用库中的函数,则该库函数会被调用多次 (2 ...

  3. 静态链接库与动态链接库的区别(Sqlite\Visual Studio 2017)

    本教程以Visual Studio 2017使用sqlite数据库为例讲解. 参考文章:https://zhidao.baidu.com/question/690811844627851604.htm ...

  4. 静态链接库与动态链接库区别

    一.        静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了.但是若使 ...

  5. 静态链接库和动态链接库区别

    转载:C++知识点14:静态链接库和动态链接库区别_htt789的博客-CSDN博客_c++静态链接和动态链接 重点: 1.动态库和静态库的区别在于链接时候的方式不同. 2.静态库链接方式:在程序编译 ...

  6. cnsl是什么意思_VS2010下创建静态链接库和动态链接库

    VS2010下创建静态链接库和动态链接库 类封装成dll如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类 ...

  7. UNIX环境高级编程(三)—— 静态链接库与动态链接库

    动态链接库一般不开放源码,需要建工程才能使用(其中提供的接口和 API): 0. .a/.o/.so What are .a and .so files? .o 就相当于 windows 里的 obj ...

  8. 35.静态链接库和动态链接库

    35.1.函数库的前世今生 (1)函数库就是一些事先写好的函数的集合,因为函数是模块化的,因此可以被复用:我们写好了某个函数,可以被反复使用,譬如A写好了某个函数然后共享出来,当B有相同的需求时就不需 ...

  9. 静态链接库与动态链接库详解

    以下内容源于C语言中文网相关内容的学习整理,如有侵权请告知删除. 一.库文件的简介 库文件,其等价为压缩包文件.该文件内部通常包含不止一个目标文件(也就是二进制文件),每个目标文件存储的代码,并非完整 ...

最新文章

  1. 你的编程能力从什么时候开始突飞猛进的?
  2. 调试神经网络的checklist,切实可行的步骤
  3. RLC协议简单理解2-RLC窗口的维护
  4. Java基础篇:回调机制详解
  5. 命令python所在的驱动器和文件夹_Python读取不同本地驱动器位置的文件
  6. git安装与配置_git 安装及基本配置
  7. spring social_Spring Social入门–第2部分
  8. 计算机诞生发展分类特点及应用,计算机的诞生与发展,及其特点
  9. linux安装mysql要先装jdk吗_linux安装mysql5.7.22,tomcat,jdk
  10. oracle中nvarchar2字符集不匹配
  11. python网络通信传输的数据类型_Python网络编程中的网络数据和网络错误。
  12. ChaiNext:多空胶着
  13. SSH Config Editor Mac(SSH配置编辑器)V2.2
  14. Mybatis源码概览(一)
  15. Asp.net中的页面乱码的问题
  16. python编程从入门到实践(第2版)第二章练习题解答
  17. 详解程序化交易、量化交易、高频交易、算法交易、各是什么意思?
  18. 考研线性代数手写笔记1 行列式
  19. 职业生涯规划之自我探索论文
  20. 翻译文本的软件有哪些?这几个翻译工具你可以试试看

热门文章

  1. 「网络安全」安全设备篇(5)——UTM
  2. ROS下连接Dobot魔术师机械臂
  3. 二、微信小程序-快速回顾 ( 页面文件 )
  4. Java中switch的参数类型
  5. 修改wangEditor编辑器高度height
  6. mysql的单表和多表练习
  7. 2014开篇:为什么我不爱读书不爱学习
  8. 最新可靠好用的DNS服务器地址汇总
  9. sqlilabs—less5
  10. c++对象数组模学生成绩管理系统Demo