1.编译过程与动态库静态库的实现

动静态库详解 动静态库详解认识动静态库动静态库各自的特征如何打包,生成动静态库 认识动静态库 一. 动静态库的基本原理 首先我们先了解一下一个代码转换成程序需要的步骤都有哪些: 预处理: 将代码转换成test.i代码 ,还是c语言代码 编译: 将test.i转换成汇编语言代码,test.s 汇编: 将test.s转换成可重定向的二进制文件(目标文件),test.o 链接: 将这些二进制文件链接起来转换成真正意义上的可执行文件。 那么库是怎么形成的呢?? 当我们将代码从test.c变为test.o的时候,我们将这些.o 阅读详情

1.Linux 如何安装 C++ 编译环境

(1)安装 gcc

下载:sudo apt install gcc g++ 
安装:gcc/g++ -v/--version

其中 gcc 用于编译 C ,g++ 用于编译 C++

版本要 >4.8.5 这样才能使用 C++11 的特性

(2) 使用 g++ 编译代码

首先现在对应目录下编写一个 c++ 程序,如:test.cpp,然后执行下面的命令进行编译

g++ test.cpp -o test.out

其中 -o 代表:生成可执行目标文件

test.out 是用户自定义的可执行文件名称,在 linux 下是 .out 在 windows 中是 .exe

(3)运行可执行文件

不能直接敲指令 test.out ,要在前面加 ./test.out

2.编程语言的发展

2.1 编程语言的发展

image-20211029105526970

机器语言:计算机识别的语言

汇编语言:使用简单的符号代替机器语言

2.2 GCC 工作流程

image-20211029110101814

预处理:将头文件导入,宏替换,去掉一些注释

编译:对预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码

汇编:对汇编代码进行处理,生成处理器能识别的指令

目标代码:计算机可以识别的代码

链接:将这个文件中使用的相关库进行链接,形成可执行程序

2.3 gcc 编译选项代码演示

image-20211029111249299 image-20211029110233749 image-20211030103225473

分别执行上面的代码:

1.-E

预处理源文件

g++ test.cpp -E -o test.i
image-20211029111708675

这是一个长长的文件,直接定位到 Hello World 部分,可以看到所有的注释,宏定义,头文件全部被替换

2.-S

生成汇编代码

g++ test.i -S -o test.s
image-20211029111913031

**3.-s **

生成可执行文件

g++ test.s -s -o test.o
image-20211029112057911

上图是一对乱七八糟的东西,其实这个文件不能被打开。但是可以直接执行

image-20211029112207044

4.一步式操作

g++ test.cpp
image-20211029112518629

可以看到上图直接生成了一个 ,out 文件,同理如果直接跳过 -E 还有 -S 直接执行 -s 也是可以的

2.库的制作

库文件是计算机上的一类文件,可以将库文件看做是一种代码仓库。它提供给使用者一些可以直接拿来用的变量,函数或类。库是一种特殊的程序,但是库是不能单独运行的。

库文件有两种:静态库和动态库

静态库: GCC进行链接时,会把静态库中代码打包到可执行程序中

动态库: GCC进行链接时,动态库的代码不会被打包到可执行程序中,程序启动之后,动态库会被动态加载到内存中,通过动态库地址访问动态库,但是对于自己刚刚写的库系统是不知道库的内存地址的,所以就要自己手动为动态库添加环境变量地址,通过ldd (list dynamic dependencies)命令检查动态库依赖关系

库的好处:1.代码保密(C++ 的反编译还原度非常低) 2.方便部署和分发

应用场景:比如Office软件的各个组成部分有相似的外观和功能,那么就可以调用同一个库文件中的函数生成那些组件

2.1 如何生成静态库

2.1.1 书写相关函数

1.文件如何保存

这里实现了一个算术运算的库,主要进行相关加减乘除操作,并根据命名规则将他们放在对应的目录下

image-20211030111747506

2.文件内容

(1)head.h

对函数进行声明

image-20211030112241751

(2)方法体的实现

add.c

image-20211030112339704

(3) main 执行方法实现

image-20211030112442437

2.1.1 静态库的命名规则

image-20211030105426907 image-20211030105510007

2.1.2 静态库的制作

(1)gcc -c 对库文件编译

gcc -c add.c mult.c sub.c div.c

报错,头文件找不到,使用 -I 将头文件导入

image-20211030112709156
gcc -c add.c mult.c sub.c div.c -I ../include

上面代码注意,不需要添加 head.h ,直接将文件 dictionary 添加进来即可。于是就生成了一堆 .o 文件

image-20211030113140520

(2)对 .o文件进行打包 ,成 .a 库文件

ar rcs libmath.a add.o div.o mult.o sub.o

(3)执行 main.c 方法

执行 main.c 方法,调用的库都是从 head 文件中查找的,所以还会报一个找不到 head.h 文件的情况。这时候将 head.h 再次导入

gcc  main.c -I include/ // 编译
image-20211030114005640

如上图所示,提示未引用库的 error ,这里需要使用 -L 参数将打包的库进行引用

gcc main.c -o app -I ./include/ -L ./lib/ -l math

注意:

-l 参数后的内容是和 -L 后面的文件对应的 .a 文件相关,调用的时候直接添加 lib 的名称即可

2.2 动态库的制作

这里是将上面的文件定义成动态库的方式

2.2.1 文件命名规则

image-20211030121941820

2.2.2 动态库的制作

1.gcc 得到 .o 文件,得到和位置无关的代码

gcc -c -fpic add.c div.c mult.c sub.c -I ../include/

参数:fpic 生成与位置无关的代码,原因是动态库与静态库不同,静态库是将静态库代码嵌套在可执行文件中。但是动态库的代码是放在内存的,是不确定位置的,所以就需要有这个参数

2.gcc 得到动态库

gcc -shared *.o -o libmath.so

*.o 就是将所有的 .o 文件聚合,注意这里别忘了加 .o 参数

shared 作用是生成一个共享库

image-20211030122540111

如上图所示就生成了一个 .so 的可执行文件

3.根据动态库生成可执行文件

gcc main.c -o main -I include/ -L lib/ -l math

但是如果执行这个可执行文件就发现报错,主要是找不到共享库的地址

image-20211030123155301

2.2.3 如何让程序找到共享库

image-20211030123245912
ldd main // 查看所用动态库
image-20211030123531107

查看电脑环境变量:

那么这样的话只需要将动态库的地址配置到环境变量中既可

env

其中 path 就是配置的环境信息

image-20211031223057671

2.2.4 在环境变量中声明动态库

为环境变量添加动态库(用户级别的配置)

用户级别配置是在 .bashrc 文件下配置的

编辑 .branch 文件,在最后添加动态库地址,最后再将这个文件编译一下

image-20211031224750386
source .bashrc   or  . .bashrc // 编译文件

source 的含义是读取并执行 source 后面文件;. 是 source 这个 operation 的简写。最后在执行 ldd main 就找到了这个库的地址,并且 main 这个文件也可以执行

image-20211031225123798

知识延伸:如何查看某个变量的值

上面使用 $+变量名获取变量值,用同样的方法再结合shell 指令就可以使用 ¥ 将这个值输出,看到这个变量中拼接的值

echo $LD_LIBRARY_PATH
image-20211031230234741

为环境变量添加动态库(系统级别的配置)

系统界别的配置主要是在 /etc/profile 文件中,所以就在这个文件下对这个变量添加动态库目录

sudo vim /etc/pro

使用和上面相同的添加动态库的指令,并在最后一行添加动态库地址,并且使用 source 进行编译

image-20211031230654338

最后在执行 main 方法就发现可以运行了

2.2.5 在文件列表中添加 PATH

通过 2.2.3 动态库的保存路径中获知可以直接修改 /etc/ld.so.cache 文件对动态库 path 进行调用。但是这个文件如果使用 vim 打开都是乱码,其实这个文件可以通过使用 conf 文件进行映射

sudo vim /etc/ld.so.conf

直接将地址粘贴到这个文件中即可

image-20211031232137699

然后使用 ldconfig 指令将动态库进行共享

sudo ldconfig

最后就可以直接对 main 文件执行

视频作者不太建议使用直接更改 lib 的方式更改库文件,因为 lib 中的文件太多,容易混乱

2.3 动态库和静态库的区别

2.3.1 制作流程上的差别

1.静态库的制作

image-20211101103923631

2.动态库的制作

image-20211101104000087

2.3.2 静态库的优缺点

1.静态库

优点缺点
静态库被打包到应用程序中加载速度快消耗系统资源,浪费内存
发布程序无序提供静态库,直接调用静态库当静态库中代码更新后,所以引用它的文件全部要进行相关喜欢,更新,部署,发布麻烦

2.动态库

优点缺点
可以实现进程间资源共享加载速度比静态库慢
相比于静态库,动态库更新部署发布简单发布程序是时需要提供依赖的库文件
可以控制何时加载动态库
【gcc】 gcc编译动态库(共享库)、静态库|链接静态库、动态库 目录 即看即用 一、GCC 简介 GCC编译流程 GCC编译选项 二、GCC生成动态库和静态库 三、生成动态库和静态库实例 四、静态库和动态库的使用和配置 静态库的使用 共享库的使用 不到你指定链接的so错误 编译链接静态库、动态库 链接动态库 即看即用 多个源文件/目标生成动态库 a. gcc -fPIC -shared ... 阅读详情

相关推荐

深入浅出之动态库与静态库

动态库是一种在程序运行时才被加载的库文件,它包含了函数和数据,可以被多个程序共享。

浩瀚之水的专栏 2840

(接上篇)反编译两种可执行文件

上篇地址:http://blog.csdn.net/eliot_shao/article/details/78648314 上篇主要内容回顾: 上篇内容介绍了静态编译生成静态库,然后链接静态库生成可执行文件的过程;也对比介绍了动态编译生成动态库然后链接动态库生成可执行文件的过程。我们也得出了结论: 链接静态库生成的可执行文件main运行不依赖与静态库是否存在,而链接动态库生成的可执行文件ma

Eliot_shao的专栏 9704

反激开关电源变压器设计实战:从理论到绕制的完整流程解析

本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。

weixin_29305313的博客 683

GCC的使用

源代码转化为可执行文件是通过编译器的预处理生成.i中间文件,然后对中间文件进行编译生成.s汇编文件,然后编译器把编译出来的.s汇编文件汇编成具体CPU上的目标代码模块,变为.o机器语言。然后通过通过链接合并已编译的模块,最终生成可执行文件。............

m0_72299782的博客 650

【MMDetection3.0实战】从零构建自定义数据集训练流程

本文详细介绍了使用MMDetection3.0框架从零开始构建自定义目标检测数据集的完整训练流程。内容涵盖环境配置、COCO格式数据准备、核心代码改造、模型配置与训练策略调优,以及最终的模型测试与验证,帮助开发者快速上手并训练自己的检测模型。

l6m7n8的博客 313

深入解析YT8521S千兆以太网PHY芯片的设计与调试要点

本文深入解析了YT8521S千兆以太网PHY芯片的设计与调试要点。重点剖析了硬件设计中的电源方案、RGMII接口电平配置(尤其是1.8V电平方案)以及PCB布局布线等关键细节,并提供了从硬件检查、驱动配置到性能测试的完整调试流程,帮助工程师规避常见陷阱,实现稳定可靠的千兆网络连接。

weixin_29190573的博客 687

gcc基本操作(带例子)

gcc 基本操作1.什么是gcc2.基本工具、命令使用3.稍复杂一点的例子(1)代码(2)操作4.总结5.参考 1.什么是gcc   gcc(GNU Compiler Collection )是由GNU项目产生的优化编辑器支持各种编程语言、硬件架构和操作系统, 2.基本工具、命令使用 3.稍复杂一点的例子 (1)代码 (2)操作 4.总结 5.参考 ...

上帝的骰子 6669

Windows非分页缓冲池内存泄漏实战:PoolMon与RAMMap高效排查指南

本文详细介绍了Windows系统中非分页缓冲池内存泄漏的实战排查方法。当系统出现卡顿且内存占用异常增长时,通过RAMMap工具快速定位非分页缓冲池异常,并利用PoolMon监控内核内存分配标签,精准锁定泄漏源。文章提供了从确认症状、安装工具到使用findstr命令溯源驱动文件的完整五步排查流程,并总结了常见泄漏标签与解决方案,帮助用户高效解决深层系统内存问题。

weixin_28455801的博客 1009

Linux系统编程-静态库和动态库

静态库:以静态文件的形式在编译的时候和将要运行的程序编译在一块,如果有多个程序需要使用静态库,那么就会在多个程序中就都会多出一个静态库的大小。 动态库:与静态库不同,动态库是在多个程序运行时共享,即多个程序会共享这个库,而不是每个程序都包含这个库,只会共享。 既然动态库比静态库有这么明显的优势,为什么还会存在静态库? 答案就是在调用函数的速度,静态库比动态库的速度快。 静态库在什么方面使用呢? 静态库:对空间要求低,对时间要求高的核心程序。 动态库:对事件要求低,对空间要求高的程序。 静态

好好学习,天天向上 740

如何用YOLOv5改进无人机小目标检测?MFFSODNet实战教程(附代码)

本文详细介绍了如何利用YOLOv5框架结合MFFSODNet网络结构优化无人机航拍图像中的小目标检测。通过引入微小目标预测头、多尺度特征提取模块(MSFEM)和双向密集特征金字塔网络(BDFPN)等核心技术,显著提升了小目标检测精度。文章提供了完整的代码实现方案,并展示了在农业监测、电力巡检等实际场景中的应用效果。

sre5engineer的博客 738

gnss变形监测基础(四)

监测站的数据采样率指的是监测站在单位时间内收集数据的频率,通常以赫兹(Hz)为单位。在GNSS变形监测中,数据采样率决定了监测系统能够捕捉到的变形动态变化的详细程度和时间分辨率。例如,一个采样率为1Hz的GNSS监测站意味着它每秒钟收集一次位置数据;而一个采样率为10Hz的监测站则每秒钟收集10次位置数据。较高的采样率能够提供更细致的时间序列数据,有助于分析快速变化的动态过程,如地震活动或建筑物的振动响应。然而,较高的采样率也意味着数据量更大,可能需要更多的存储空间和更强大的数据处理能力。

我的博客 1292

动态库、静态库编译测试:含静态库链接动态库、静态库,动态库链接静态库、动态库

本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。 一。内容包含: ①静态库libbb.a依赖静态库libaa.a的测试; ②静态库libbb.a依赖动态库libaa.so的测试; ③动态库libbb.so依赖静态库libaa.a的测试; ④动态库libbb.so依赖动态库libaa.so的测试; ...

AmyAndTommy的博客 6669

第5.2章 【自动驾驶行业融合定位核心】:手把手详解ESKF(误差卡尔曼滤波)理论公式及代码

自动驾驶定位中的ESKF(误差卡尔曼滤波)技术是解决IMU累积误差的关键,通过分离名义状态与误差状态实现高精度定位。其核心步骤包括:1)名义状态递推(位置/速度/姿态的基础物理计算);2)误差传播建模(雅可比矩阵F量化误差影响);3)协方差更新(评估定位不确定性)。ESKF在GNSS信号丢失(如隧道场景)、无卫星定位(地下车库)等场景发挥重要作用,通过融合多传感器数据维持定位精度。工程实现需解决零偏校准、协方差投影等关键问题,噪声参数需通过数据标定而非随意设置。掌握ESKF原理与实现是自动驾驶定位工程师的核

行知SLAM 704

动态库与静态库

一篇文章搞懂动静态库的原理,创建,优缺点以及使用。

2301_80926085的博客 2623

C#与大数据分析:如何通过上位机进行设备故障诊断与预测

设备故障诊断是通过对设备的运行状态数据进行分析,识别和确认故障的类型和位置。而设备故障预测则是通过对设备的历史数据和运行状态进行分析,预测设备何时可能出现故障,从而进行预防性维护。数据采集:通过各种传感器、PLC、嵌入式设备等采集设备运行数据,如温度、压力、振动、转速、功率等。数据预处理:对采集到的数据进行清洗、去噪、缺失值处理、标准化等操作,以确保数据质量。特征工程:从原始数据中提取出有助于故障诊断和预测的特征,例如统计特征、时域特征、频域特征等。数据分析与建模。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1060

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

makefile编译静态库与动态库

在大型的项目中,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中。为了方便调用其他文件夹中的文件,最通用的方法就是将一些文件编译成静态的库或动态库,这样在包含其他文件夹的头文件时可以更加简便。 1.编译静态库 bin :存放可执行文件 build:存放编译生产的二进制文件(xx.o) include:存放程序编译时需要调用的头文件(xx.h) lib:存放程序链接时(生成可执行...

青山绿水 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Linux】动态库和静态库——动态库和静态库的打包和使用、gcc编译、拷贝到系统默认的路径、建立软连接

Linux、动态库和静态库、静态库和动态库的介绍、静态库的打包和使用、生成静态库、使用静态库的三种方式、gcc编译、拷贝到系统默认的路径、建立软连接、动态库的打包和使用、生成动态库、使用动态库、解决加载不到动态库的方法

Crocodile1006的博客 2730

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Linux】静态库与动态库

【Linux】静态库与动态库

一点一点变好 2479

linux编译生成动态库、静态库,以及使用

一、介绍 在实际开发过程中,当代码的文件较多,可以将一部分代码编译成动态库或者静态库然后再加载到程序中使用 编译过程 1、预编译 2、编译 3、汇编 4、链接 静态库和动态库的差异 1、链接静态库简单理解就是复制目标代码嵌入可执行文件中 2、动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本 3、动态库在程序运行时被链接,故程序的运行速度和链接静态库的版本相比必然会打折扣 gcc总体选项列表 1) -c :指编译,不链接,生成目标文件“.o”。 2) -S :只编译,不汇编,生成汇编代码“.S”。 3

锅锅的博客 9189

静态库与动态库

当动态库更新时,只要保证库的接口不变,使用该库的程序不需要重新编译链接,直接替换动态库文件即可,方便了程序的更新和维护。链接时机不同:静态库是在程序编译时被链接到目标代码中的,而动态库是在程序运行时才被加载。:程序运行时不需要额外加载库文件,因为库的内容已经整合到了可执行文件中,所以程序的运行速度相对更快。静态库:静态库是一种目标文件的集合,它是在程序编译时被链接到目标代码中的。:程序运行时需要找到对应的动态库文件,如果动态库文件缺失或版本不匹配,可能会导致程序无法正常运行。

m0_75252503的博客 3196

Linux下g++编译与使用静态库和动态库

在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的。刚开始可能会不适应,但是用多了应该会习惯这种使用,因为步骤上并没有VS下配置那么繁琐。下面就分别总结下linux下生成并使用静态库与动态库的方法

Sean.W的专栏 3万+

将静态库编译到动态库中

最近做一个东西,需要采集硬件设备的音视频数据,然后做编码。以前做过编码部分直接拽过来使用,只写硬件采集部分即可。调查发现,硬件采集驱动过于老旧,必须使用ffmpeg3的API,而编码部分则使用了ffmpeg4。 改动编码部分降级为ffmpeg3不现实,引出来多少问题不太确定。由此设计一套方案: 编码部分使用ffmpeg4的动态库,链接位置自己指定 将硬件采集代码设计为...

xy_kok的博客 7256

预编译,动态库与静态库

c语言编译的4个阶段:预编译,编译,汇编,链接预处理阶段会在源代码中查找预编译指令,其主要是头文件(include)宏定义(define)选择性编译(indef)三种指令预处理命令以符号#开头​优点:1,扩展了c程序设置的环境2,简化程序的开发过程3,提高代码可读性注:1,实际上不是c语言的部分2,预编译指令在编译前由预处理程序对源文件的预处理的文件进行加工库也叫代码库,可以把一些目标文件合并在一起方便使用分类动态库静态库区别。

weixin_66549224的博客 1007

linux动态库与静态库

linux动态库与静态库

2302_80190394的博客 1437

动态库静态库的制作过程

动态库和静态库是在软件开发中常见的库文件类型,用于存储可重用的代码和资源,以便在程序中进行调用。: 静态库是一组预编译的目标文件(通常是 .lib 文件),其中包含了一组函数和数据,可以被链接到程序中。静态库在编译时将库中的代码复制到最终可执行文件中,因此可执行文件比较大。每次程序被编译时,静态库都会被复制到最终的可执行文件中,因此可以在不同的环境中运行。

qq_58395220的博客 1022

C++中编译静态库与动态库

静态库与动态库

scott198512的博客 3971
上一篇: 计算机组成原理---第四章 存储器(下)
下一篇: 2.Makefile
许菠萝
博客等级 码龄10年 263粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值