动静态库【Linux】

文章目录

  • 静态库的打包
  • 动态库的打包

静态库的打包

把我们提供的方法,给别人用:

1、把源文件直接给别人
2、把源代码打包成库=库+.h
例如 ;有a.c b.c c.c d.c ,四个.c文件 ,
将a.c 形成a.o ,b.c形成b.o c.c形成c.o d.c形成d.o文件,将这些文件打包
在这里插入图片描述

ar命令用于将目标文件打包为静态库

-r(replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的目标文件。
-c(create):建立静态库文件
-t:列出静态库中的文件。
-v(verbose):显示详细的信息

在这里插入图片描述

[cxq@iZ7xviiy0goapxtblgih6oZ test]$ tree .
.
├── lib
│   ├── include
│   │   └── mymath.h
│   └── mymathlib
│       └── libmymath.a
└── main.c3 directories, 3 files
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ll
total 8
drwxrwxr-x 4 cxq cxq 4096 May 28 19:12 lib
-rw-rw-r-- 1 cxq cxq   83 May 29 15:13 main.c
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ gcc main.c -I ./lib/include/ -L  ./lib/mymathlib/ -lmymath
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ll
total 20
-rwxrwxr-x 1 cxq cxq 8536 May 29 16:26 a.out
drwxrwxr-x 4 cxq cxq 4096 May 28 19:12 lib
-rw-rw-r-- 1 cxq cxq   83 May 29 15:13 main.c
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ./a.out
1+1=2

在这里插入图片描述

-I 用来指明头文件在哪里
-L用来指明库文件在哪里
-l 表示需要链接的库的名称

**往后使用第三方库的时候,必定要是用gcc -l **

在这里插入图片描述
如果系统中只提供静态链接,gcc则只能对该库进行静态链接
如果系统中需要链接多个库,则gcc可以链接多个厍

将头文件和库文件拷贝到系统的默认目录下

[cxq@iZ7xviiy0goapxtblgih6oZ test]$ tree .
.
├── a.out
├── lib
│   ├── include
│   │   └── mymath.h
│   └── mymathlib
│       └── libmymath.a
└── main.c3 directories, 4 files
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ sudo cp lib/include/mymath.h /usr/include/
[sudo] password for cxq: 
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ls /usr/include/mymath.h
/usr/include/mymath.h
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ sudo cp lib/mymathlib/libmymath.a  /lib64/
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ls /lib64/libmymath.a
/lib64/libmymath.a
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ll
total 20
-rwxrwxr-x 1 cxq cxq 8536 May 29 16:26 a.out
drwxrwxr-x 4 cxq cxq 4096 May 28 19:12 lib
-rw-rw-r-- 1 cxq cxq   83 May 29 15:13 main.c
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ gcc main.c -lmymath
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ./a.out
1+1=2

在这里插入图片描述
库的安装就是将头文件和库文件拷贝到系统的默认目录下

建立软链接

[cxq@iZ7xviiy0goapxtblgih6oZ test]$ tree ../
../
├── libmymath.a
├── Makefile
├── mymath.c
├── mymath.h
├── mymath.o
└── test├── a.out├── lib│   ├── include│   │   └── mymath.h│   └── mymathlib│       └── libmymath.a└── main.c4 directories, 9 files
[cxq@iZ7xviiy0goapxtblgih6oZ test]$  sudo ln -s /home/cxq/lesson23/test/lib/include /usr/include/myinc
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ls /usr/include/myinc
mymath.h[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ls -l  /usr/include/myinc
lrwxrwxrwx 1 root root 35 May 30 16:36 /usr/include/myinc -> /home/cxq/lesson23/test/lib/include
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ sudo ln -s  /home/cxq/lesson23/test/lib/mymathlib/libmymath.a  /lib64/libmymath.a
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ls  /lib64/libmymath.a
/lib64/libmymath.a
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ll
total 8
drwxrwxr-x 4 cxq cxq 4096 May 28 19:12 lib
-rw-rw-r-- 1 cxq cxq   90 May 30 21:49 main.c
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ gcc main.c -lmymath
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ll
total 20
-rwxrwxr-x 1 cxq cxq 8536 Jun  1 09:12 a.out
drwxrwxr-x 4 cxq cxq 4096 May 28 19:12 lib
-rw-rw-r-- 1 cxq cxq   90 May 30 21:49 main.c
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ./a.out
1+1=2

在这里插入图片描述

动态库的打包

将多个.c文件形成多个.o文件,然后将形成的这些.o文件打包,形成动态库
无论是动态库还是静态库,都要先形成.o文件

在这里插入图片描述

将多个.c文件形成多个.o文件

[cxq@iZ7xviiy0goapxtblgih6oZ lesson23]$ gcc  -fPIC -c myprint.c
[cxq@iZ7xviiy0goapxtblgih6oZ lesson23]$ gcc  -fPIC -c mylog.c

-fPIC(position independent code):产生位置无关码

1、-fPIC作用于编译阶段,告诉编译器产生与位置无关的代码,此时产生的代码中没有绝对地址,全部都使用相对地址,从而代码可以被加载器加载到内存的任意位置都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

2、如果不加-fPIC选项,则加载.so文件的代码段时,代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的拷贝,并且每个拷贝都不一样,取决于这个.so文件代码段和数据段内存映射的位置。

3、不加-fPIC编译出来的.so是要在加载时根据加载到的位置再次重定位的,因为它里面的代码BBS位置无关代码。如果该.so文件被多个应用程序共同使用,那么它们必须每个程序维护一份.so的代码副本(因为.so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)。

4、我们总是用-fPIC来生成.so,但从来不用-fPIC来生成.a。但是.so一样可以不用-fPIC选项进行编译,只是这样的.so必须要在加载到用户程序的地址空间时重定向所有表目

在这里插入图片描述

打包

[cxq@iZ7xviiy0goapxtblgih6oZ lesson23]$ gcc -shared -o libmymethod.so *.o

在这里插入图片描述

将.c文件形成.o文件和打包融合到Makefile里面

在这里插入图片描述

[cxq@iZ7xviiy0goapxtblgih6oZ lesson23]$ make ; make output
gcc -fPIC -c  mylog.c
gcc -fPIC -c myprint.c
gcc -shared  -o libmymethod.so mylog.o myprint.o
gcc -c mymath.c
ar -rc libmymath.a mymath.o  
mkdir -p mylib/include
mkdir -p mylib/lib
cp *.h mylib/include
cp *.a mylib/lib
cp *.so mylib/lib
[cxq@iZ7xviiy0goapxtblgih6oZ lesson23]$ ll
total 60
-rw-rw-r-- 1 cxq cxq 1880 Jun  1 16:26 libmymath.a
-rwxrwxr-x 1 cxq cxq 8144 Jun  1 16:26 libmymethod.so
-rw-rw-r-- 1 cxq cxq  460 Jun  1 16:25 Makefile
drwxrwxr-x 4 cxq cxq 4096 Jun  1 16:26 mylib
-rw-rw-r-- 1 cxq cxq   85 Jun  1 14:44 mylog.c
-rw-rw-r-- 1 cxq cxq   62 Jun  1 14:53 mylog.h
-rw-rw-r-- 1 cxq cxq 1568 Jun  1 16:26 mylog.o
-rw-rw-r-- 1 cxq cxq  265 May 28 18:20 mymath.c
-rw-rw-r-- 1 cxq cxq  159 May 28 18:19 mymath.h
-rw-rw-r-- 1 cxq cxq 1704 Jun  1 16:26 mymath.o
-rw-rw-r-- 1 cxq cxq  176 Jun  1 14:43 myprint.c
-rw-rw-r-- 1 cxq cxq   55 Jun  1 14:43 myprint.h
-rw-rw-r-- 1 cxq cxq 1728 Jun  1 16:26 myprint.o
drwxrwxr-x 3 cxq cxq 4096 Jun  1 09:12 test

使用静态库:
在这里插入图片描述

使用动态库:

[cxq@iZ7xviiy0goapxtblgih6oZ test]$ gcc main.c -lmymethod  -I  mylib/include/   -L  mylib/lib
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ll
total 20
-rwxrwxr-x 1 cxq cxq 8384 Jun  2 16:52 a.out
-rw-rw-r-- 1 cxq cxq  168 Jun  2 15:43 main.c
drwxrwxr-x 4 cxq cxq 4096 Jun  2 16:20 mylib
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ./a.out
hello new world!
hello new world!
hello new world!
hello new world!
Warning: hello log function
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ tree .
.
├── a.out
├── main.c
└── mylib├── include│?? ├── mylog.h│?? ├── mymath.h│?? └── myprint.h└── lib├── libmymath.a└── libmymethod.so3 directories, 7 files

在这里插入图片描述

动态库和静态库一起使用:

[cxq@iZ7xviiy0goapxtblgih6oZ test]$ gcc  main.c  -lmymath -lmymethod -I mylib/include/   -L mylib/lib
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ll
total 20
-rwxrwxr-x 1 cxq cxq 8608 Jun  2 18:21 a.out
-rw-rw-r-- 1 cxq cxq  164 Jun  2 18:20 main.c
drwxrwxr-x 4 cxq cxq 4096 Jun  2 16:20 mylib
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ./a.out
1+1=2
hello new world!
hello new world!
hello new world!
hello new world!
Warning: hello log function

在这里插入图片描述

在这里插入图片描述
出现上述现象原因:
gcc main.c -lmymethod -I mylib/include/ -L mylib/lib
动态库的路径已经告诉编译器路径了,但是没有告诉系统(加载器),
对于动态库,动态库是一个独立的文件,形成的可执行程序文件和动态库文件,这两者是两个不同的文件,

解决加载找不到动态库的四种方案(第一种最常用):
1.拷贝到系统默认的库路径/lib64(常用) 或者 /usr/lib64/ (不常用)
2.在系统默认的库路径/lib64(常用)或者 /usr/lib64/(不常用)下建立软连接

[cxq@iZ7xviiy0goapxtblgih6oZ test]$ tree .
.
├── a.out
├── main.c
└── mylib├── include│   ├── mylog.h│   ├── mymath.h│   └── myprint.h└── lib├── libmymath.a└── libmymethod.so3 directories, 7 files
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ pwd
/home/cxq/lesson24/test
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ sudo ln -s /home/cxq/lesson24/test/mylib/lib/libmymethod.so  /lib64/libmymethod.so
[sudo] password for cxq: 
[cxq@iZ7xviiy0goapxtblgih6oZ test]$ ls /lib64/libmymethod.so
/lib64/libmymethod.so

在这里插入图片描述

3.将自己的库所在的路径,添加到系统的环境变量LD_LIBRARY_PATH中

[cxq@iZ7xviiy0goapxtblgih6oZ test]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/cxq/lesson24/test/mylib/lib 

在这里插入图片描述
但是如果关闭xshell,刚刚添加的路径就没了
如果需要长期有效:

[cxq@iZ7xviiy0goapxtblgih6oZ test]$ vim ~/.bash_profile

在这里插入图片描述

4./etc/ld.so.conf.d建立自己的动态库路径的配置文件,然后重新ldconfig即可

[root@iZ7xviiy0goapxtblgih6oZ test]# cd /etc/ld.so.conf.d
[root@iZ7xviiy0goapxtblgih6oZ ld.so.conf.d]# ll
total 16
-rw-r--r--  1 root root 26 Oct 16  2023 bind-export-x86_64.conf
-r--r--r--  1 root root 63 Jan 26 00:21 kernel-3.10.0-1160.108.1.el7.x86_64.conf
-r--r--r--. 1 root root 63 Oct 20  2020 kernel-3.10.0-1160.el7.x86_64.conf
-rw-r--r--. 1 root root 17 Oct  2  2020 mariadb-x86_64.conf
[root@iZ7xviiy0goapxtblgih6oZ ld.so.conf.d]# touch cxq.conf

在这里插入图片描述
动态库在进程运行的时候,是要被加载的(静态库没有)
常见的动态库被所有的可执行程序(动态链接的),都要使用,所以动态库也叫做共享库
所以,动态库在系统中加载之后,会被所有进程共享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端Vue3】——JQuery知识点总结(超详细)

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门知识专栏:🎇【MySQL&#…

【力扣刷题 动态规划】LeetCode 139 单词拆分、LeetCode 300 最长递增子序列 ✌

文章目录 1. 单词拆分2. 最长递增子序列 1. 单词拆分 题目链接 &#x1f34e; 解题思路&#xff1a; class Solution {bool dp[310] {false};public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> myset;for(auto& str :…

《欢乐钓鱼大师》新手攻略大全!新手逆袭之路!

《欢乐钓鱼大师》是一款趣味十足的模拟钓鱼游戏&#xff0c;适合各类玩家&#xff0c;从钓鱼新手到钓鱼高手都能在游戏中找到乐趣。为了帮助新手玩家更快地掌握游戏技巧&#xff0c;提高钓鱼水平&#xff0c;我们准备了一些实用的攻略和技巧&#xff0c;帮助大家轻松入门&#…

PDF 文件的解析

1、文本 PDF 的解析 1.1、文本的提取 进行文本提取的 Python 库包括&#xff1a;pdfminer.six、PyMuPDF、PyPDF2 和 pdfplumber&#xff0c;效果最好的是 PyMuPDF&#xff0c;PyMuPDF 在进行文本提取时能够最大限度地保留 PDF 的阅读顺序&#xff0c;这对于双栏 PDF 文件的抽…

MyBatis3.4全集笔记

MyBatis 1. MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Ja…

SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解(源码级讲解,耐心看完)

SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解 这里我先引出问题然后再来一步步进行剖析,SpringSecurity到底是如何实现引入依赖后所有请求都需要进行认证并且会弹出login登录表单页面. 接下来会对SpringBoot的自动装配进行详解,SpringSecurity也是通过自动装配…

AI绘画Stable Diffusion 制作幻术光影字:使用Brightness亮度控制模型,超简单!

大家好&#xff0c;我是灵魂画师向阳。 今天给大家分享的教程是利用AI工具Stable Diffusion 制作光影文字。这是一种通过模拟自然光线照射和阴影效果&#xff0c;使文字看起来具有立体感和逼真感的设计风格。 它的主要目的是让文字自然的融合在场景中。 先来看组实例图。 …

【机器学习数据挖掘】基于ARIMA 自回归积分滑动平均模型的销售价格库存分析报告 附完整python代码

资源地址&#xff1a;Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 ​ 完整代码分析 同时销售量后1000的sku品类占比中&#xff08;不畅销产品&#xff09;如上&#xff0c;精品类产品占比第一&#xff0c;达到66.7%&#xff0c;其次是香化类产品&#…

【赠书活动】好书推荐—《详解51种企业应用架构模式》

导读&#xff1a; 企业应用包括哪些&#xff1f;它们又分别有哪些架构模式&#xff1f;世界著名软件开发大师Martin Fowler给你答案。 01 什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里所谈及的模式也都是关于企业应用的。&#xff08;企业应用…

逐步掌握最佳Ai Agents框架-AutoGen 八 开源模型

前言 本篇文章&#xff0c;我们来探索下AutoGen使用其它LLM大模型。主要原因是AutoGen在使用chatgpt3.5/chatgpt 4等付费模型时&#xff0c;token开销比较大。如果我们的业务&#xff0c;社区里的开源模型就能搞定&#xff0c;那当然就开冲了。 接下来就让我们看下&#xff0…

书籍《钱从哪里来5:微利社会》观后感

样例 前几周看完了这本书&#xff0c;《钱从哪里来5&#xff1a;微利社会》&#xff0c;这应该算是&#xff0c;作者香帅在“得到”出的第5本书了。个人来看&#xff0c;或者说尽自己而言&#xff0c;现在并不是对财理相关话题&#xff0c;有很大兴趣&#xff0c;只是在跨年的时…

有哪些好用的ai工具,可以提升科研、学习、办公等效率?

最近&#xff0c;Sora的诞生为AI再添了一把火。 据介绍&#xff0c;这款“文生视频”的Sora可以直接输出长达60秒的视频&#xff0c;并且包含高度细致的背景、复杂的多角度镜头&#xff0c;以及富有情感的多个角色。 不仅能准确呈现细节&#xff0c;还能理解物体在物理世界中…

指针的认识(野指针、规避野指针、assert宏断言)

目录 a.野指针成因 1.指针未初始化 2.指针越界访问 3.指针指向的空间释放 b.规避野指针 1.指针初始化 2.小心指针越界 3.指针变量不再使用时&#xff0c;及时置NULL&#xff0c;指针使用之前检查有效性 4.避免返回局部变量的地址 c.assert宏断言的使用 概念&#xff1…

容器化部署Pig微服务快速开发框架

系统说明 基于 Spring Cloud 、Spring Boot、 OAuth2 的 RBAC 企业快速开发平台&#xff0c; 同时支持微服务架构和单体架构 提供对 Spring Authorization Server 生产级实践&#xff0c;支持多种安全授权模式 提供对常见容器化方案支持 Kubernetes、Rancher2 、Kubesphere、E…

适合小白学习的项目1901java体育馆管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java体育馆管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&am…

【STL深入浅出】之string类的简单模拟实现

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

“慢公司”小红书,加速布局大模型

自成立至今&#xff0c;小红书一直保持低调并被形容为“慢公司”&#xff0c;而这也反映在大模型相关产品线上。尽管上线了多项功能和应用&#xff0c;存在感却稍显不足。 进入2024年&#xff0c;小红书在大模型领域的探索悄然加速&#xff0c;持续引发市场关注度。 多方消息…

BIOS主板(非UEFI)安装fedora40的方法

BIOS主板(非UEFI)安装fedora40的方法 现实困难&#xff1a;将Fedora-Workstation-Live-x86_64-40-1.14.iso写入U盘制作成可启动U盘启动fedora40&#xff0c;按照向导将fedora40安装到真机的sda7分区中得到报错如下内容&#xff1a; Failed to find a suitable stage1 device: E…

socket.gaierror: [Errno 11001] getaddrinfo failed

socket.gaierror: [Errno 11001] getaddrinfo failed 错误通常表示在解析主机名或 IP 地址时出现问题。这可能是因为提供的 IP 地址或主机名无效&#xff0c;或者存在 DNS 解析问题。 打印日志发现config.ini中的host不能加引号

Javaweb基础之json

大家好&#xff0c;这里是教授.F 目录 引入&#xff1a; 定义格式&#xff1a; json规制&#xff1a; 字符串转json&#xff1a; json转字符串: 字符串和json转化细节&#xff1a; json在java中的使用: 应用实例&#xff1a; JavaBean和json字符串的转换&#xff1a; l…