一、前言

1、动态链接库(dll)与静态链接库(lib):

动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件和可执行文件(exe)非常类似,区别在于dll中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。

静态链接库(lib) 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件包含函数代码本身,在编译时直接将代码加入程序当中。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。

2、使用dll和lib:

使用lib所需文件:

头文件:包含lib中说明输出的类或符号原型或数据结构。

lib文件:文件是静态编译出来的,索引和实现都在其中。

静态编译的lib文件有好处:给用户安装时不需要再挂动态库。缺点:导致应用程序比较大,失去动态库的灵活性,在版本升级时,同时要发布新的应用程序。

使用dll所需文件:

头文件:包含lib中说明输出的类或符号原型或数据结构。

lib文件:包含被DLL导出的函数的名称和位置。

dll文件:包含实际的函数和数据。

应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数和内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。静态库包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中。动态库中包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供。总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。

二、静态库的生成

1、采用的平台是VS2015:新建C++ Win32项目AddLib

2、选择静态库,点击“完成”

3、分别添加Add.h及Add.cpp

4、.h及.cpp中分别添加如下代码,之后生成解决方案

//Add.h#pragma once
#ifndef _ADD
#define _ADD
double Add(double a, double b);
#endif // !_ADD//Add.cpp#include "Add.h"
#include "stdafx.h"double Add(double a,double b)
{return a + b;
}

在工程Debug目录下便可看到生成的.lib静态库

三、静态库的调用

1、新建Win32控制台应用程序TestAddLib

2、 将之前生成的静态库Add.lib及头文件Add.h复制粘贴到该项目工程文件夹下

(1)添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录;
           (2)添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录;

(3)添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名Add.lib
           (4)在头文件中添加.h头文件

或者直接在源代码中加入#pragma comment(lib, “Add.lib”),此时不必再进行上述4个步骤

#include "stdafx.h"
#include "Add.h"
#pragma comment(lib,"Add.lib")int main()
{double sum = Add(333.333333, 333.333333);printf("%.6f", sum);return 0;
}

3、运行即可,大功告成!!!

动态库.dll的生成及使用参见我的下一篇博客:C++中.lib静态库、.dll动态库的生成及调用<2>

C++中.lib静态库、.dll动态库的生成及调用1相关推荐

  1. C++中.lib静态库、.dll动态库的生成及调用2

    关于动.静态库的介绍及静态库的生成及调用参见:C++中.lib静态库..dll动态库的生成及调用<1>,本文主要介绍基于VS2015平台的动态库dll的生成及调用方法. 一.动态库的生成 ...

  2. VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)

    VC环境下的静态库使用 一.  静态库包括.lib和.h文件,在工程中使用静态库分为3步: <1> 在工程中加入静态库,有三种方法: **方法一:项目设置中引用.lib,project-& ...

  3. VS2019:C++程序lib静态库、dll动态库的生成和使用

    一.静态库 静态库的使用需要(1).h头文件:(2).lib静态库文件: 1.静态库生成 (1)项目-右键属性-常规-配置类型-选静态库: (2)点击生成,Debug文件夹下出现lib静态库: 2.静 ...

  4. 【Cmake实战:番外】库、动态库和静态库(.dll,.so,.lib,.a)

    [Cmake实战:番外]库.动态库和静态库(.dll,.so,.lib,.a) 一.什么是库 二.库的种类 三.命名方式 四.动态库和静态库的特点 五.如何知道一个可执行程序依赖哪些库 六.linux ...

  5. C/C++库文件全了解(包含静态库、动态库,包含windows、linux,包含dll、lib、so)

    目录 C/C++库文件全了解 一. 前言 二. 名词解释 2.1. windows的静态库:xxx.lib 2.2. windows的动态库:xxx.dll 2.3. linux的动态库:libxxx ...

  6. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...

    一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...

  7. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  8. .h头文件 .lib库文件 .dll动态库文件之间的关系

     .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和li ...

  9. 如何判别lib文件是静态库还是动态库的导入文件呢

    我么知道lib文件存在两种情况: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接 库dynamic link librar ...

最新文章

  1. 如何在python开发的GUI界面程序中恰当地使用PyExecJS
  2. 华为手机怎么看图片属性_华为手机音量小怎么办
  3. 笔记-中项案例题-2018年上-人力资源管理
  4. VS2013和VS2015中MVC 区域路由匹配顺序相反
  5. RPi 2B python opencv camera demo example
  6. Linux:分享50个实用的基础命令,欢迎收藏!
  7. Hibernate 笔记4 实现对数据库的增删改查
  8. javascript “||”、“”的运用
  9. 服务器不能访问共享文件夹权限,win访问服务器共享文件夹权限设置
  10. BBV:实验基本块向量生成工具
  11. 扎根本地连接未来 千米网的电商“红海”生存术
  12. Windows输入体验是什么,Windows11输入体验在哪里
  13. numpy系列之拷贝和视图
  14. 【手写字母识别】基于matlab GUI BP网络手写体大写字母识别【含Matlab源码 183期】
  15. R 包的手动打包流程
  16. 超市称秤小票用计算机怎么算,电脑收银系统如何连接电子条码秤
  17. 贪心算法 --- 例题2.哈夫曼编码问题
  18. CentOS安装Nacos后,输入默认用户名和密码nacos/nacos,提示“用户名或密码错误”
  19. PTA A1007A1008
  20. seo与sem的关系和区别

热门文章

  1. Django1.9开发博客02- 模型
  2. Kendall’s tau-b,pearson、spearman三种相关性的区别(有空整理信息检索评价指标)
  3. 一个由印度人编写的VC串口类
  4. WinJS实用开发技巧(3):仿微博信息流JK快捷键滚动
  5. 基于Javaweb实现超市管理系统
  6. Python 与 Excel结合
  7. Ensemble Methods——python
  8. jsonp解决跨域问题
  9. [分享]关于windows下的小技巧
  10. 事件源event.target