首页 > 其他分享 >visual studio当中动态库和静态库的联系

visual studio当中动态库和静态库的联系

时间:2024-08-19 10:51:08浏览次数:10  
标签:文件 静态 xxx 编译 visual studio cpp 动态

一、为什么要写这篇博客

公司需要调用MNN框架编译之后的动态库静态库文件来在另外一台没有编译过MNN框架上的机器运行对应的程序,比如说人体关键点检测之类的程序,这个时候了解静态库和动态库的关系就很有必要了。

二、现代编译器编译流程

源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标代码(object code)→ 链接器(linker)→ 可执行文件(executables),最后打包好的文件就可以给计算机去判读运行了。所谓的IDE(集成开发环境)就是把这些步骤集成到一起,方便程序员使用。具体流程参见下图:

image

详细步骤如下:

  • 预处理:执行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)

标签:文件,静态,xxx,编译,visual,studio,cpp,动态
From: https://www.cnblogs.com/Vsonic12138/p/18366892

相关文章

  • 浏览器解析html文件src静态资源路径问题
    相对路径src资源引号内部不以/分割符开头,浏览器从当html文件前路径拼接url:场景a<imgsrc="static/1.jpeg"width="258"height="39"/>当前请求地址xxxx:80/html/1.html浏览器解析图片地址为xxxx:80/html/static/1.jpeg场景b<imgsrc="../static/1.jpeg"width="......
  • 值类型和引用类型、装箱和拆箱、静态类和普通类、方法的重载、继承和多态、访问修饰符
    目录一、值类型和引用类型的区别?值类型(ValueTypes)定义:特点:示例:引用类型(ReferenceTypes)定义:特点:示例:举例说明:总结:二、装箱和拆箱装箱(Boxing)特点:示例:拆箱(Unboxing)特点:示例:示例代码:装箱和拆箱的影响最佳实践:三、静态类和普通类的区别?静态类(Static......
  • Visual Studio使用Git进行代码版本管理
    一、VisualStudio创建一个项目1、在VisualStudio中创建一个项目,我创建的项目名称是"mainApi"二、Gitee中新建仓库1、右上角点击【个人头像】,选择【新建仓库】2、输入对应的信息,点击【创建】-(1)输入仓库名称,一般与本地程序名称一致-(2)介绍一下该仓库是干什么的,也可以不......
  • VisualVM第二章-Threads
    ThreadsTab页介绍线程Tab页分三个部分:线程数量统计、线程取样、线程状态线程数量统计左上角统计了当前存线程数以及守护线程数。ThreadDump线程取样,点击ThreadDump可以对当前程序运行的线程进行取样分析。取样文件默认存储在临时目录:你还可以对当前dump文件另存......
  • LangGraph Studio:首款智能体(agent)IDE
    0前言LangGraphStudio提供了一个专门的智能体IDE,用于可视化、交互和调试复杂的智能体应用程序。本文来了解如何在桌面使用。LLM为新型智能体应用程序的发展铺平了道路——随这些应用程序演进,开发它们所需工具也必须不断改进。今天推出的LangGraphStudio——首款专为Agent开......
  • HCL学习——直连路由和静态路由
     vlan的目的是隔离广播域,能不能互访不是关注的事。vlan是二层技术,上了三层就不管用了。要两个vlan在网络层实现互通,要通过路由器。 两个vlan能通。 如果有20个vlan,就连20个接口,上述解法不好,有个技术叫单臂路由。单臂路由现在也不用了,但是原理要掌握。两个vlan要走同一......
  • PbootCMS伪静态配置让整个地址更美观
    标签作用:配置程序伪静态后URL中将不再包含index.php,整个地址更美观1、IIS环境(IIS6的环境自行百度):1)安装rewrite组件,如果使用空间一般空间商默认已经安装;2)到后台配置参数中开启伪静态开关(老版本直接修改程序config/config.php文件url_type=2);3)在站点目录建立web.config文件......
  • FL Studio21中文版本破解中文版本下载2024年8月最新
    ......
  • Visual Studio 第一行,scanf报错解决。#define _CRT_SECURE_NO_WARNINGS 1
    【问题描述】想必大家刚装好VisualStudio,准备自信满满去开始编写自己的第一个程序时,却出现这个错误: 'scanf':Thisfunctionorvariablemaybeunsafe.Considerusingscanf_sinstead.Todisabledeprecation,use_CRT_SECURE_NO_WARNINGS.Seeonlinehelpfordet......
  • 静态块,实例块,构造方法执行顺序
    publicclassTest{privatefinalStringa;static{System.out.println("静态初始化块执行");}//类加载时执行{System.out.println("实例初始化块执行");a="123";}//实例块在构造之前publicTest(){......