Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux基础——gcc编译、静态库与动态库(共享库)

Linux基础——gcc编译、静态库与动态库(共享库)

作者头像
全栈程序员站长
发布于 2022-11-10 07:48:40
发布于 2022-11-10 07:48:40
9K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

gcc编译器

1、gcc工作流程

2、gcc常用参数

参数

用途

-v

查看版本

-o

产生目标文件

-I+目录

指定头文件目录

-D

编译时定义宏

-00/-01/-03

没有优化/缺省值/优化级别最高

-Wall

提示更多警告信息

-c

只编译子程序

-E

生成预处理文件

-g

包含调试信息

静态库

1、静态库的命名格式 lib + 库的名字 + .a 例:libMyTest.a (MyTest为静态库的名字)

2、静态库作用分析 在项目开发过程中,经常出现优秀代码重用现象,又或者提供给第三方功能模块却又不想让其看到源代码,这些时候,通常的做法是将代码封装成库或者框架,生成的静态库要和头文件同时发布。

优点:

  • 寻址方便,速度快
  • 库在链接时被打包到可执行文件中,直接发布可执行程序即可以使用

缺点:

  • 静态库的代码被加载到可执行程序中,因此体积过大
  • 如果静态库的函数发生改变,必须重新编译可执行程序

3、静态库的制作与使用

测试代码的目录结构如上图所示,include中存放的是头文件,lib中存放的是静态(动态)库,src中存放的是源代码,main.c是发布代码。

第一步:得到*.o文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc *.c -c -I../include

第二步:创建静态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ar rcs libMyTest.a *.o        将所有.o文件打包为静态库,r将文件插入静态库中,c创建静态库,不管库是否存在,s写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。
mv libMyTest.a ../lib         将静态库文件放置lib文件夹下
nm libMyTest.a                查看库中包含的函数等信息

第三步:使用静态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
第一种方法:
gcc + 源文件 + -L 静态库路径 + -l静态库名 + -I头文件目录 + -o 可执行文件名
gcc main.c -L lib -l MyTest -I include -o app
./app

第二种方法:
gcc + 源文件 + -I头文件 + libxxx.a + -o 可执行文件名
gcc main.c -I include lib/libMyTest.a -o app

动态库(共享库)

1、动态库的命名格式 lib + 库的名字 + .so 例:libMyTest.so (MyTest为动态库的名字)

2、动态库作用分析 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

优点:

  • 节省内存
  • 易于更新,不用重新编译可执行程序,运行时自动加载

缺点:

  • 延时绑定,速度略慢

3、动态库的制作与使用

测试代码的目录结构与静态库相同。

第一步:生成与位置无关的.o文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -fPIC *.c -I ../include -c   参数-fPIC表示生成与位置无关代码

第二步:创建动态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -shared -o libMyTest.so *.o        参数:-shared 制作动态库 -o:重命名生成的新文件
mv libMyTest.so ../lib

第三步:使用动态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
第一种方法:
gcc + 源文件 + -L 动态库路径 + -l动态库名 + -I头文件目录 + -o 可执行文件名
gcc main.c -L lib -l MyTest -I include -o app
./app
(执行失败,找不到链接库,没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径)

第二种方法:
gcc + 源文件 + -I头文件 + libxxx.so + -o 可执行文件名
gcc main.c -I include lib/libMyTest.so -o app
(执行成功,已经指明了动态库的路径)

如何解决第一种方法中找不到链接库的问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
使用命令ldd app可以查看当前的链接库情况

第一种方法:
export LD_LIBRARY_PATH=自定义动态库的路径
(只能起到临时作用,关闭终端后失效)
LD_LIBRARY_PATH : 指定查找共享库(动态链接库)时除了默认路径之外的其他路径,该路径在默认路径之前查找

第二种方法:
将上述命令写入home目录下的.bashrc文件中,保存后重启终端生效(永久)

第三种方法:
直接将动态库拷贝到user/lib的系统目录下(强烈不推荐!!)

第四种方法:
将libmytest.so所在绝对路径追加入到/etc/ld.so.conf文件,使用sudo ldconfig -v 更新

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月27日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)
上次介绍了基础IO(二):Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)
是Nero哦
2024/07/01
3020
Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)
动态库与静态库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。
二肥是只大懒蓝猫
2023/03/30
2.4K0
动态库与静态库
Linux gcc编译生成静态库和共享动态库的过程
这篇文章主要通过实例演示在Linux下如何使用gcc分别编译生成静态库和动态库文件以及其它程序如何使用这个生成的静态库和动态库。
typecodes
2024/03/29
8480
Linux gcc编译生成静态库和共享动态库的过程
【库函数】Linux下动态库.so和静态库.a的生成和使用
我在路径/root/host/my_program/asoc/include下创建四个文件
SarPro
2024/04/25
2.2K0
【库函数】Linux下动态库.so和静态库.a的生成和使用
Linux静态库与动态库加载
        关于库相比大家之前肯定使用过,比如C/C++里面的标准库,STL里面的各种库,我们在调用STL里的容器时都需要使用库,那么库到底是什么呢?
咬咬
2024/06/12
4230
Linux静态库与动态库加载
【Linux】软硬连接与动静态库
硬连接不是一个独立的文件,因为它没有的独立的inode号,用的是目标文件的inode
用户11029103
2025/03/10
1060
【Linux】软硬连接与动静态库
c++动态库和静态库的区别_静态库里面包含动态库
C++静态库与动态库
全栈程序员站长
2022/11/11
2K0
详解动态库和静态库
在C、C++中我们使用过标准库,比如在使用strerror、vector、string等时,都只是调用了这些函数接口,这些都是需要具体的实现。
南桥
2024/06/03
2640
详解动态库和静态库
【Linux基础IO】Linux IO编程入门:揭秘动态库与静态库的秘密
前言:在Linux的浩瀚编程海洋中,IO(输入/输出)操作作为系统与外界交互的基石,其重要性不言而喻。无论是文件读写、网络通信还是设备驱动,都离不开IO操作的支撑。而在这个过程中,动静态库作为代码复用和模块化的重要手段,扮演着至关重要的角色。它们不仅简化了开发流程,提高了开发效率,还通过优化资源使用和减少编译时间等方式,为Linux程序的性能和可维护性保驾护航
Eternity._
2024/10/01
1350
【Linux基础IO】Linux IO编程入门:揭秘动态库与静态库的秘密
linux 动态库 静态库_静态库里面包含动态库
那么这三个时间有什么作用呢? 我们在使用自动化构建工具Makefile时,如果连续make会发现:
全栈程序员站长
2022/11/10
7.6K0
linux 动态库 静态库_静态库里面包含动态库
【Linux】动静态库
静态库是一种在编译阶段将库文件的内容直接整合到目标程序中的库文件形式。使用静态库后,库的代码会成为可执行文件的一部分,运行时不需要依赖外部库。
用户11305458
2025/01/09
1540
【Linux】动静态库
深入浅出动静态库
  当你在Linux系统上编写和运行程序时,动态库和静态库是两个非常重要的概念。它们不仅影响着程序的编译和执行效率,还直接关系到程序的可移植性和灵活性
用户11029129
2024/06/04
1560
深入浅出动静态库
C语言 | 什么是静态链接库和动态链接库?
今天分享的是静态链接库和动态链接库的相关知识,并且自己动手写一个简单的静态函数库和动态函数库,来体验这个流程。
飞哥
2020/08/11
4.8K0
C语言 | 什么是静态链接库和动态链接库?
【Linux】动静态库(超详细)
💢 由于CentOS 8系统2021年12月31日已停止维护服务,CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 9及后续版本,不再支持新的软件和补丁更新。CentOS用户现有业务随时面临宕机和安全风险,并无法确保及时恢复。
IsLand1314
2024/11/19
1190
【Linux】动静态库(超详细)
Linux软硬链接与动静态库
我们看到, 真正找到磁盘上文件的并不是文件名, 而是inode, 其实在linux中可以让多个文件名对应于同一个inode.
用户11317877
2025/02/19
1380
Linux软硬链接与动静态库
Linux环境下静态库和动态库的实现
在软件开发中,库是非常重要的组成部分。它们包含了一组可复用的函数和代码片段,用于提高开发效率和代码质量。在Linux系统中,库分为静态库和动态库两种。本文将介绍它们的实现方式,结合C语言代码进行说明,并详细解释其原理和使用方法。
ahao
2025/01/05
1441
C语言---静态库VS动态库
在编程的过程中,使用已经封装好的库函数是十分方便的,也是十分高效的,因此会使用函数库是很重要的。在C语言中,函数库文件分为两种类型,一种是静态库(库程序是直接注入目标程序的,不分彼此,库文件通常以.a结尾),另一种是动态库(库程序是在运行目标程序时(中)加载的,库文件通常以.so结尾),下面我们就探索一下这两种库文件的特点和使用方式吧!
HeaiKun
2020/07/07
9.1K0
【Linux系统IO】六、动静态库
​ 我们之前学 gcc 的时候也有接触过一点动静态库的知识,现在要把它单独拿出来讲,主要是因为我们后面肯定在自己开发的时候需要包装自己的库,此时就需要有动静态库的原理知识和使用知识!
利刃大大
2025/03/11
1060
【Linux系统IO】六、动静态库
深入浅出链接库 | 静态库与动态库
不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个功能的实现。这就是库文件,功能提供者把头文件和库文件发布给我们,我们便可以根据头文件中的接口去调用库文件中实现的功能,并且对我们隐藏了功能实现的源码和细节。其实,链接库(动态库和静态库)并没有什么神秘的,本文就带你一起解开链接库的神秘面纱,让大家自己也可以动手制作动态库与静态库。
mindtechnist
2024/08/08
8280
深入浅出链接库 | 静态库与动态库
【Linux】————动静态库
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
用户11036582
2024/10/23
1720
【Linux】————动静态库
相关推荐
Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验