我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++静态链接与动态链接详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++静态链接与动态链接详解

一、GCC工作流程

预处理:把#头文件展开,进行宏替换,去掉注释(生成.i文件)

编译:把预处理后的文件生成汇编文件(.s文件),主要是检查语法、语义问题

汇编:把汇编文件生成目标文件(.o文件)

链接:将函数库中相应的代码组合到目标文件,生成可执行文件(默认a.out文件)

o文件不会立即执行,因为可能出现:一个.cpp文件中的函数引用了另一个.cpp文件中定义的符号/调用了某个库文件中的函数。链接的目的就是将这些文件对应的目标文件链接成一个整体,从而生成可执行文件。

二、静态链接与动态链接

程序库:包含数据和执行代码的文件,不能单独执行,可以作为程序库的一部分来完成某些功能。

库的存在可以使程序模块化,可以加快程序的再编译,实现代码复用,便于更新程序

程序库又分为静态链接库与动态链接库

1、静态链接

在链接阶段,将汇编生成的.o文件和所需要的库一起链接打包到可执行文件中去,程序运行的时候不再调用其它的库文件

一个静态库,可以看作是一些目标代码的集合,在可执行程序运行前就已经加入到执行代码中,成为执行程序的一部分。

静态链接的优点:对运行环境依赖小,具有较好的兼容性。

静态链接的缺点:生成的程序较大,需要更多的系统资源(所需的所有库都被打包进可执行文件了),在装入内存中消耗更多时间

一旦库函数有了更新,必须重新编译应用程序

此处,我们制作实现加减乘除的静态库,首先编写add.c、sub.c、mul.c、div.c文件及对应.h文件,另外编写text.c文件进行测试。gcc -c 生成目标文件.o,然后将.o文件打包,制作静态库libtext.a

2、动态链接

静态库存在的问题:

(1)若两个.o文件都使用同一个静态库,那么内存中会拷贝2份静态库的代码,然 后分别与两个.o文件一起打包到可执行文件中,造成空间浪费。

举个例子:某个静态库占1M内存,有2000个.o文件使用这个静态库,内存中有2000个静态库的代码(将近2000GB),空间浪费严重。

(2) 所需的库被拷贝到可执行文件中去了,如果某个库更新了,则与它相关的所有可执行文件都需要重新编译。

为了解决这两个问题,引出动态库(又称共享库),动态库在程序编译时,并不会被链接到目标代码中,而是在运行时载入,不同应用程序如果调用相同的的库,内存里只有一份共享库的实例,避免了浪费。由于动态库在运行时才被载入,也解决了静态库对程序的更新、部署和发布带来的马粪,用户只需要更新动态库即可。

动态链接的优点:链接时,仅仅建立与所需库函数之间的关系;

在程序运行时才将所需资源调入可执行程序;

简化程序的升级,有较小的程序体积;

实现进程之间的资源共享,内存中只有一份动态库的实例,避免充分拷贝

动态链接的缺点:依赖动态库,不能独立运行

动态库依赖版本问题严重

同样的,我们制作制作实现加减乘除的动态库。

我们把动态库.so和测试文件.c拷贝当前目录,使得系统加载可执行文件时,能够知道所依赖的库的名字,但是还需要找到动态库的绝对路径,此时需要系统动态载入器(dynamic linker/loader)。对于elf格式的可执行程序,是由ld-linux.so*来完成的。搜索elf文件的DT_PATH段(环境变量)LD_LIBRARY_PATH,/etc/ld.so.cache文件列表,/urs/lib目录找到库文件后将其载入内存。

动态库加载失败的解决办法:这里给出两个解决办法,来找到动态库

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++静态链接与动态链接详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

CGO_ENABLED 如何影响动态链接和静态链接?

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《CGO_ENABLED 如何影响动态链接和静态链接?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。问题内容我们正在编译要在 doc
CGO_ENABLED 如何影响动态链接和静态链接?
2024-04-04

linux中动态链接和静态链接的区别有哪些

这篇文章主要介绍“linux中动态链接和静态链接的区别有哪些”,在日常操作中,相信很多人在linux中动态链接和静态链接的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux中动态链接和静态链接
2023-06-29

Linux 下静态链接和动态链接的原理及应用

我们知道一个.c 文件经过编译、链接最终可以形成一个可执行文件。

linux下静态链接库和动态链接库的区别有哪些

这篇文章主要讲解了“linux下静态链接库和动态链接库的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下静态链接库和动态链接库的区别有哪些”吧!
2023-02-07

C# 调用动态链接库(DLL)技术详解

C#可以通过平台调用服务(P/Invoke)或者Common Language Runtime(CLR)的集成方法来调用DLL中的函数。
C#DLL开发2024-11-30

C++封装静态链接库和使用的详细步骤

这篇文章主要介绍了C++封装静态链接库和使用,本文描述了怎么去把一个C++程序封装成一个静态库并且如何去使用这些静态库,需要的朋友可以参考下
2022-11-13

ubuntu中python调用C/C++方法之动态链接库详解

安装booJlLUslVOSstpython调用C/C++的方法有很多,本文使用boost.python。考虑到后期有好多在boost上的开发工作,所以boost一并安装了,Boost库分为两个部分来使用,一是直接使用对应的头文件,二是需要
2022-06-04

C#与C++动态链接库DLL参数互传方式

这篇文章主要介绍了C#与C++动态链接库DLL参数互传方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

C#中怎么修改动态链接库

这期内容当中小编将会给大家带来有关C#中怎么修改动态链接库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#实现修改动态链接库,将b修改为双重指针:public class RefComm { [Dl
2023-06-17

实例详解 - 静态链接在 Linux 上的工作原理

在本文中,我将解释如何创建静态链接的可执行文件。

什么是动态链接库?

动态链接库(DLL)是Windows共享库,包含动态加载到运行程序中的代码和资源。与静态链接不同,动态链接允许程序在运行时使用外部库,节省内存并提高性能。DLL具有代码共享、模块化、平台独立性、性能提升和故障隔离等优点。加载过程包括操作系统搜索、映射和调用。DLL导出函数和数据,程序通过导入表访问。版本控制和注册表对于DLL管理至关重要。常见问题包括DLL地狱和劫持。使用DLL时需要注意版本兼容性、依赖项、注册和安全性。
什么是动态链接库?
2024-04-02

Linux 上静态链接库工作原理

学习如何用静态链接库将多个 C 目标文件结合到一个单个的可执行文件之中。在这篇文章中,我将说明如何创建一个静态链接的可执行文件。

快速掌握 Go 二进制文件的静态和动态链接

今天我们快速的介绍了 Go 语言中的静态和动态链接的基本概念,打了个底。静态链接会实现 ALL IN ONE 的效果,确保编译出来的二进制文件能够在标准的环境下运行。而动态链接则相反。
WebGo语言2024-11-28

Linux环境变量与动态链接关系

Linux环境变量与动态链接关系密切,其中LD_LIBRARY_PATH环境变量尤为重要,它指定了动态链接器在运行时查找共享库的路径。环境变量对动态链接的影响动态链接库的搜索路径:动态链接库(共享库)是在程序运行时加载的,系统会根据LD_
Linux环境变量与动态链接关系
2024-09-24

怎么理解C++内链接与外链接

本篇内容主要讲解“怎么理解C++内链接与外链接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解C++内链接与外链接”吧!首先理解什么是编译单元?我们知道,其实编译器在编译代码时,只会去编译
2023-06-25

怎么使用C/C++生成的动态链接库

这篇文章主要讲解了“怎么使用C/C++生成的动态链接库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用C/C++生成的动态链接库”吧!操作环境:Visual Studio 2017.N
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录