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

Delft3D从入门到实践:安装、编译与首次模拟指南

本文为Delft3D初学者提供了一份详尽的从零开始指南。内容涵盖软件获取、许可证申请、图形界面安装、核心计算内核的编译环境搭建与编译步骤,以及最终整合运行首个水动力模拟的全流程。重点解决了Windows系统下Delft3D安装与编译的常见问题,帮助用户快速上手这一开源水动力与泥沙输运模拟工具。

weixin_29303701的博客 538

GCC的使用

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

m0_72299782的博客 650

铭飞MCMS源码部署

文章目录前言一、下载铭飞源码二、部署源码1.使用IDEA打开源码2.配置tomcat环境2.1下载tomcat并测试是否可以成功启动(此处不赘述)2.2在IDEA中安装tomcat环境并配置3.添加数据库,并配置3.1新建数据库3.2 导入sql配置三、启动测试 前言 铭飞MCMS基于IDEA、tomcat和mysql的环境搭建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载铭飞源码 gitee:https://gitee.com/mingSoft/MCMS/releases(各种版本按需下

MARS_ZORO的博客 4064

4、I3C协议详解

I3C最初的设计目的是为移动设备创建一个能够使用多个传感器的单一接口。随着现代化移动设备对于传感器数量的增加以及对性能的提高,I2C和SPI已经达到了他们所能支持的临界点,而I3C的出现就是为了解决这一问题,I3C可以在同一根主线上支持更多的传感器设备,而且不会因为要支持中断或睡眠模式而增加额外的逻辑信号。I3C可以在更低功耗的情况下提供更快的传输速率,该特性的提升不止是对移动设备,对其他的嵌入式设备也都是很大的帮助。例如穿戴设备,需要在有限的物理空间中使用多个传感器并且要求更小的耗电。 一、简述..

迟子涵925的博客 2万+

gcc基本操作(带例子)

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

上帝的骰子 6669

智能体在车联网中的应用:第31天 基于RLlib的多智能体PPO实战:MAPPO算法解决simple_spread合作任务

本文介绍了如何利用RLlib框架实现多智能体强化学习算法MAPPO,解决simple_spread任务。首先分析了RLlib的架构设计理念和多智能体支持特性,包括策略映射、环境包装等核心组件。然后详细解析了simple_spread环境的任务定义、观察空间和奖励函数设计。最后回顾了MAPPO算法原理,说明其如何在RLlib中实现集中式训练与分布式执行的CTDE范式。文章提供了完整的安装指南和环境配置方法,帮助读者快速搭建多智能体强化学习实验环境。

IT深耕十余载,大道之简 1332

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

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

好好学习,天天向上 740

使用TinyProxy搭建代理服务器

背景 办公电脑所在网络无法连接外网,机房服务器可以连接外网,通过服务器代理上网; 一、CentOS下TinyProxy安装–搭建代理服务器 TinyProxy是个轻量级简单的HTTP/HTTPS代理程序,GitHub和官网,安装方式这里主要介绍两种 CentOS下yum安装,参考:TinyProxy安装 Docker安装 先安装docker环境yum install docker -y 二、Win10下使用 ...

椰汁菠萝 1万+

【Flink】Flink 消费一段时间1万多条数据就卡死

我们有个现场环境,发现了奇怪的现象,就是每次启动任务后,消费1万多条数据后就会卡死,然后整个流不消费,也不往下输出,看起来卡死了一样。缺图这里面出现的网闸原因导致的,但是经过我们写了一个简单的kafka消费程序,然后在出问题的节点上消费数据,实际排查,发现不是这个问题。这个问题,发现也不是,这段时间没有进行过kafka数据清理。里面的问题。因为这个问题,我们后面的代码刻意规范了,不这样操作。后来是在没办法了,然后我们dump了线程,发现有如下代码。

九师兄 350

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

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

AmyAndTommy的博客 6669

测试用例设计工具大盘点:总有一款适合你

本文旨在帮助测试工程师、开发人员及团队管理者快速了解主流测试用例设计工具的特点、适用场景和选择逻辑。覆盖工具类型包括传统文档工具、开源管理工具、商业集成平台及新兴AI工具,范围涵盖中小团队到大型企业的不同需求。本文从“测试用例设计的痛点”切入,用生活案例解释核心概念;接着按“工具类型”分类盘点主流工具(附优缺点对比表);再通过“小团队/中大型团队/敏捷团队”等真实场景教你选工具;最后展望AI等未来趋势,帮你“一次学透,终身受用”。

项目管理的博客 1590

动态库与静态库

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

2301_80926085的博客 2623

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

随着现代化经济的快速发展,物质条件富足的人开始追求精神富足,越来越多的人通过饲养观赏鱼来充实生活、释放压力,但并非所有饲养者都有时间和经验来管理好鱼缸。一种由单片机控制,可实时检测和调节鱼缸环境,可把鱼缸环境实时反映给用户并能被用户远程操控的系统,可以解决养鱼成活率低、耗费时间和精力、参与感不强等诸多难题。

嵌入式技术开发 7351

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

makefile编译静态库与动态库

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

青山绿水 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

Crocodile1006的博客 2730

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【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、付费专栏及课程。

余额充值