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

1. 静态库(.lib)

  • 函数实现和变量的二进制文件
  • 编译链接可执行程序时,静态库会直接展开到文件。
  • 发布可执行程序时,不需要静态库。
  • 编译出的可执行文件较大。

2. 动态库(.dll)

  • windows下动态库一般包含引入库(.lib)文件和动态库(.dll文件)。
  • dll包含函数实现和变量;lib包含该dll的中函数和变量的声明和位置,引入lib库后,就可以找到dll库。
  • 编译链接时只需要lib,程序运行时才动态加载dll,将该dll映射到进程的地址空间中,然后访问dll中导出的函数。
  • 发布时,需要携带lib和dll文件。
  • 编译出的可执行文件较小。

二、动态库的使用

1. 隐式链接

需要.h,lib库,dll库。lib库只在编译用,dll库在运行时用

1.1 (方法一)在VS中配置

比较繁琐,建议方法二

1.1.1 .h库引用

工程属性—>VC++目录—>包含目录—>选择.h所在目录

1.1.2 lib库引用

(1)工程属性—>VC++目录—>库目录—>选择lib所在目录

(2)在链接时,也需要lib库
工程属性—>链接器—>输入—>附加依赖项

1.1.3 dll库引用

我一般就直接配置环境变量了,当然也可以在VS配置dll工作目录,方法如下
(1)工程属性—>VC++目录—>可执行文件目录—>选择可执行目录

(2)配置dll目录,工程属性—>VC++目录—>可执行文件目录—>选择可执行目录

Windows查找dll库的顺序:

  • exe文件所在的目录下;
  • 进程当前的工作目录;
  • Windows系统目录;
  • Windows目录;
  • 环境变量Path下的一系列目录

1.2 (方法二)最简单的办法

(1)添加lib库,工程属性—>VC++目录—>库目录—>选择lib所在目录(或者直接在代码里写#pragma comment(lib, “Lib.lib”)

#include "stdafx.h"
#include "DLLSample.h"#pragma comment(lib, "DLLSample.lib")    int main()
{TestDLL(123);   //dll中的函数,在DllSample.h中声明return(1);
}

(2)添加.h头文件,工程属性—>VC++目录—>包含目录—>选择.h所在目录
(3)将dll库放入项目目录

2. 显示链接

如果只有dll库,则只能进行显示链接

  • 使用Windows API的LoadLibrary函数,将DLL模块映像到进程的内存空间,对dll模块进行动态加载。
  • 使用GetProcAddress函数得到要调用dll中的函数的指针。
  • 不用dll时,使用FreeLibrary函数或从进程的地址空间显式卸载dll。
#include <iostream>
#include <windows.h>         //使用函数和某些特殊变量typedef void (*DLLFunc)(int);int main()
{DLLFunc dllFunc;HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");//可以使用dll库的绝对路径,否则将会按照windows搜索方式进行搜索if (hInstLibrary == NULL){FreeLibrary(hInstLibrary);}dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");if (dllFunc == NULL){FreeLibrary(hInstLibrary);}dllFunc(123);std::cin.get();FreeLibrary(hInstLibrary);return(1);
}

三、静态库的使用

  • 静态库lib文件是多个obj文件的集合,obj文件是cpp文件编译生成的
  • lib文件包含了链接库的所有信息(函数代码和接口信息)
  • 只需要.h文件和lib文件

1. 添加lib

方式与动态库相同

2. 添加.h

方式与动态库相同

参考:基础:windows下lib和dll的区别和使用

windows平台下静态库(.lib)和动态库(.dll)使用相关推荐

  1. Visual Studio引入外部库 ---- 弄懂静态库lib和动态库dll

    这两天由于想要研究一下socket的相关内容,但是没想到引入外部库还有这么多门道. 根据维基百科定义:一个现代编译器的主要工作流程如下:源代码(source code)→ 预处理器(preproces ...

  2. 库文件、静态库(lib)与动态库(dll)的生成与使用

    静态库 程序编译一般需经预处理.编译.汇编和链接几个步骤.在应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所需的代码,复制到 ...

  3. windows和android调用第三方C++库(静态库lib、动态库dll)

     官方wiki C++调用静态库StaticLibrary(lib) Linking Static Libraries https://wiki.unrealengine.com/Linking_St ...

  4. MFC的静态库.lib、动态库.dll(包含引入库.lib)以及Unicode库示例

    以vs2012为标准.转自:http://technet.microsoft.com/zh-cn/library/w4zd66ye ,有改动. 一 MFC的静态库(.lib) MFC静态库使用下列命名 ...

  5. 查看静态库(.lib)和动态库(.dll)的导出函数的信息

    From: http://blog.csdn.net/sunliangyuan/article/details/8075808 一般情况下,我们需要查看一个DLL或EXE中的包含的函数或是依赖的函数之 ...

  6. c++ 编译添加dll_(windows平台下)深入详解C++创建动态链接库DLL以及如何使用它(一)...

    前言:C以及C++的动态链接库和静态链接库,说起来很简单,但是实际上在创建的过程中有很多的坑,本人也是一路踩了很多坑,查了很多资料,下决定写一篇完整的文章来详细解释使用VS创建C++动态链接库的完整流 ...

  7. windows平台下使用cmake构建静态lib库以及使用静态lib库gtest项目

    有些时候我们需要将部分代码编译成单独的一个库,然后在另一个项目中去使用这个库 大部分是linux环境下的指令,但是也差不是很多 记录一下构建的经过 目录 1.使用cmake构建及使用lib库 构建li ...

  8. [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...

  9. Linux下CMake简明教程(六)动态库和静态库的编译控制

    代码在git 有时只需要编译出动态库和静态库,然后等着让其它程序去使用.让我们看下这种情况该如何使用cmake.首先按照如下重新组织文件,只留下testFunc.h和TestFunc.c ├── CM ...

最新文章

  1. Windows下通过Python 3.x的ctypes调用C接口
  2. chrome 使用gpu 加速_一招解决 Chrome / Edge 卡顿缓慢 让浏览器重回流畅顺滑
  3. 怎样在半年内把一个团队带垮?
  4. PowerDesigner反向工程 mysql
  5. 2021.03.14.浩楠卷子
  6. Oracle ora-15070,查询字段过多触发了Oracle的BUG?【ORA-01465: 无效的十六进制数字】...
  7. 论文笔记_S2D.50_Kimera 具有结构规律的增量视觉-惯性三维网格生成
  8. 为资产分类定义折旧范围_SAP FICO零基础学习_0006_资产-概述和基本配置
  9. python中x 是什么意思_python中x[::]什么意思
  10. 属性子集选择的基本启发方法_【数据挖掘笔记三】数据预处理
  11. java GIF拆分和压缩处理
  12. 计算机掷骰子吗?关于随机数的一些细节
  13. ACM之路(14)—— 线段树的日常(上)
  14. js阻止冒泡事件发生(react)
  15. ndn-cxx与nfd的安装
  16. 华硕服务器主板装系统,华硕主板安装windows11失败?BIOS设置教程
  17. 计算机网络-----TCP三次握手相关面试题扩展
  18. linux获取系统时间戳
  19. fpu测试_正点原子STM32F4/F7水星开发板资料连载第五十章 FPU 测试实验
  20. Programmer-如何从菜鸟变成老鸟?

热门文章

  1. jquery多属性选择器
  2. 潮起潮落,自助餐还是被“吃”垮了
  3. 韩寒郭敬明开启音乐精准营销时代
  4. Uboot中的MIPI DSI clk分析
  5. ip r route -n
  6. 笔记:《高效能人士的七个习惯》第七章 习惯四 双赢思维——人际领导的原则
  7. 用java去掉字符串中空格,存入数据库
  8. Vue启动项目报错:Can‘t resolve ‘xxx‘ in ‘D:\briup\vue_test\node_modules\send‘
  9. 【CH376】关于CH376的一些使用总结
  10. css雪碧图如何调整大小