visual studio当中动态库和静态库的联系
一、为什么要写这篇博客
公司需要调用MNN框架编译之后的动态库和静态库文件来在另外一台没有编译过MNN框架上的机器运行对应的程序,比如说人体关键点检测之类的程序,这个时候了解静态库和动态库的关系就很有必要了。
二、现代编译器编译流程
源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标代码(object code)→ 链接器(linker)→ 可执行文件(executables),最后打包好的文件就可以给计算机去判读运行了。所谓的IDE(集成开发环境)就是把这些步骤集成到一起,方便程序员使用。具体流程参见下图:

详细步骤如下:
- 预处理:执行gcc -E xxx.cpp > xxx.i对.cpp文件进行预处理,产出xxx.i文件(由于这个文件不可以直接看到的)
- 编译:执行gcc -S xxx.cpp对.cpp文件进行编译,将高级语言转换成汇编语言,产出xxx.s文件
- 汇编:执行gcc -c xxx.cpp将汇编指令转换成机器语言,产出xxx.o目标文件(二进制)
- 链接:执行gcc xxx.cpp -o xxx.o将一个或多个由编译器或汇编器生成的目标文件和外部库链接为一个可执行文件,产出xxx.exe文件
三、静态库、动态库定义
静态库
是一个外部函数与变量的集合体。静态库的文件内容,其内容不像动态链接库那么复杂,在编译期间由编译器与链接器将它直接集成至应用程序内,并产出目标文件以及可以独立运作的可执行文件。Windows下静态库库为.lib后缀,在linux下为.a后缀。
动态库
是一个包含可由多个程序同时使用的代码和数据的库。DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数,并且允许进程可以共享调用。Windows下动态库为.dll后缀,在linux下为.so后缀。
由于C/C++的语言特性,所有的函数必须先声明再调用,所有单纯的动态库是无法被直接调用的,而导出库的作用就是用来包含动态库中所有的的函数声明。导出库虽然与静态库都是.lib文件,但是二者内容并不相同。
区别
相比于静态库直接集成到应用程序中,动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,不使用的时候再从内存释放。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。
二者在使用的时候仍然需要调用相应的头文件,来对函数进行声明。
四、如何在visual studio当中使用
使用方法参考下面的链接:
1、静态库的创建和使用
2、Visual Studio引入外部库 ---- 弄懂静态库lib和动态库dll
3、基于vs2019创建并使用动态链接库(dll)
4、【Visual Studio】创建并使用静态库(.lib)
5、vs中怎么添加外部头文件?
6、Visual Studio静态库、动态库工程使用配置
visual studio当中动态库和静态库的联系的更多相关文章
- 【转】iOS动态库和静态库的简要介绍
静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...
- 技巧:Linux 动态库与静态库制作及使用详解
技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- Linux系统中“动态库”和“静态库”那点事儿【转】
转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...
- libjpeg 交叉编译动态库和静态库
1.下载libjpeg库,解压之 得到了jpeg6b和libtool-2.2.4两个文件夹. 2.编译安装libtool工具. 这是配置libtool,这里需要注意:configure 参 ...
- VS2008 动态库和静态库的生成和加载
第一:动态库和静态库的生成: 1) 新建一个生成dll工程: 文件->新建->项目->Win32->Win32控制台应用程序 输入项目名称:dllTest ,项目路径:D:\V ...
- Linux系统中“动态库”和“静态库”那点事儿
摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...
- linux --> 动态库和静态库
库的分类 根据链接时期的不同,库分为静态库和动态库之分. 静态库:在链接阶段被链接的,生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 动态库:在程序执行的时候被链接的,即使程 ...
随机推荐
- bazel简介(二)——从makefile向bazel转变(使用genrule)
0x01 背景 上篇中已经介绍了bazel的基本工作原理和相关的概念.这篇将继续介绍下,现有的makefile构建工程如何切换到bazel构建系统. bazel提供了丰富的扩展方式,当然也支持从目前的 ...
- 获取微信小程序页面路径
2024/07/12 1.步骤 2.注意事项 3.参考 1.步骤 微信公众号关联小程序时需要用到小程序的页面路径,获取步骤如下:' 登录微信公众平台--工具--生成小程序码--获取更多页面路径--填写 ...
- win7安装snmp服务
一.安装SNMP Win7操作系统默认情况下是不安装SNMP服务的,今天讲解一下在Win7操作系统下安装SNMP,具体安装步骤如下: 打开控制面板--卸载程序 WIN7操作系统下安装SNMP的步骤如下 ...
- MySQL服务端innodb_buffer_pool_size配置参数
innodb_buffer_pool_size是什么? innodb_buffer_pool是 InnoDB 缓冲池,是一个内存区域保存缓存的 InnoDB 数据为表.索引和其他辅助缓冲区.innod ...
- 中文关键字检索分析-导出到csv或者excel-多文件或文件夹-使用python和asyncio和pandas的dataframe
1.02版本 把原来的tab一个个拼接成文件输出,改成pandas的dataframe 使用asyncio库来使用协程,但是测试下来速度好像是差不多的.可能速度太快了,没能很好的测出来差异. 原来的最 ...
- EF Core – Many to Many
前言 Many to many 是 EF Core 5.0 才开始有的, 以前都用 2 个 1-n 来实现的. 由于它比 1-n 复杂, 所以有必要写一遍来记入一下. 参考: Relationship ...
- ASP.NET Core – Web API Versioning
前言 项目持续维护, API 就需要版本控制. ASP.NET Core 有官方的插件专门处理 API 版本控制. 主要参考 Your Guide to REST API Versioning in ...
- JVM(JAVA Virtual Machine)Java虚拟机
JVM的跨平台性 一次编写,到处运行 JVM将字节码文件编译成对应操作系统的机器码 JVM的语言无关性 JVM的内存区域 虚拟机栈:在JVM运行过程中存储当前线程运行方法所需的数据,指令.返回地址 本 ...
- Windows 缺失Qt5.xxxx.dll,无法继续执行代码
事件起因: 客户自行安装完Autodesk系软件后, 软件一直弹窗报错 AutodDesktopApp.exe - 系统错误 Windows软件报错:由于找不到Qt5.xxxx.dll,无法继续执行代 ...
- Winrar 免广告、去评估版的解决办法 ( 实测有效 )
事件起因: 在打开 Winrar 压缩软件的时候,总是会弹出广告弹窗,而且上面还是显示评估版本. 解决办法: 1. 正常安装 Winrar 软件 2. 安装破解软件--Restorator http: ...