当前位置: 首页 > ds >正文

【Linux系统】动静态库的制作

前言:

        上文我们讲到了文件系统【Linux系统】详解Ext2,文件系统-CSDN博客

        本文我们来讲讲动静态库的制作

        【Linux】编译器gcc/g++及其库的详细介绍_linux gcc 有哪些库-CSDN博客

        这篇文章的第4大点,简单是介绍了一下库的基本概念。

静态库

        静态库的本质是一种归档文件,对所有.o文件进行了打包!

        不需要使用者解包,而直接使用gcc/g++进行链接即可!

#先将所有的 .c文件编译出 .o问文件
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
mstr.c  mstr.h  my.c  my.h
yc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -c *.c
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
mstr.c  mstr.h  mstr.o  my.c  my.h  my.o#再将全部 .o文件打包为静态库(不包含main函数!)
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ar -cr libmyc.a *o
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o

        如上,静态库就这样制作完成了!

        ar是归档工具,将多个.o文件打包成一个文件。选项:-rc表示replace and creat

进行链接:

        我们要链接任何非标准库(包括第三方库、自己写的库)都必须指明-L  -l

        -L:表示去哪里找库

        -l:表示找那个库

hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o  test.c
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -c *.c
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o  test.c  test.o
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -o test test.o -L . -l myc
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ./test
0 1 2 3 4 5 6 7 8 9 

        链接完成,形成可执行程序!

        注:.h文件的意义就是作为方法手册

hyc@hyc-alicloud:~/linux/动静态库的制作$ ls
lib  new test.c
hyc@hyc-alicloud:~/linux/动静态库的制作$ tree lib
lib
├── include
│   ├── mstr.h
│   └── my.h
└── mylib└── libmyc.a3 directories, 3 fileshyc@hyc-alicloud:~/linux/动静态库的制作$ gcc -o test test.c -I ./lib/include -L ./lib/mylib -l myc
hyc@hyc-alicloud:~/linux/动静态库的制作$ ls
lib  new  test  test.c
hyc@hyc-alicloud:~/linux/动静态库的制作$ ./test
0 1 2 3 4 5 6 7 8 9 

        当头文件并不在当前目录或系统中,就想要 -I选项

        -I:表示去哪里找头文件。

补充:

        库也是要被安装到系统中的!!!

        我们正常使用库,是不可能像上面一样麻烦的!

        只需要将头文件、库拷贝至系统文件下的默认路径,以后调用就只需要指明库名字即可。     

        默认路径:/usr/include,/lib64

动态库

hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
mstr.c  mstr.h  my.c  my.h#先将.c文件编译成.o
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -fPIC -c *.c
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
mstr.c  mstr.h  mstr.o  my.c  my.h  my.o#再将.o文件打包
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -shared -o libmyc.so *.o
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
libmyc.so  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o

        编译为.o文件:fPIC:产生位置无关码(position independent code)

        打包:与静态库使用ar打包不同,动态库依旧使用gcc进行打包,使用 -shared选项:表示生成共享库格式

进行链接:

hyc@hyc-alicloud:~/linux/动静态库的制作$ ls
lib  new  test.c
hyc@hyc-alicloud:~/linux/动静态库的制作$ tree lib
lib
├── include
│   ├── mstr.h
│   └── my.h
└── mylib├── libmyc.a└── libmyc.so3 directories, 4 fileshyc@hyc-alicloud:~/linux/动静态库的制作$ gcc -o test test.c -I ./lib/include -L ./lib/mylib -l myc
hyc@hyc-alicloud:~/linux/动静态库的制作$ ls
lib  new  test  test.chyc@hyc-alicloud:~/linux/动静态库的制作$ ./test
./test: error while loading shared libraries: libmyc.so: cannot open shared object file: No such file or directory

        如上,我们依旧将所有位置信息告知,链接成功得到可执行程序!

        但是当我们执行可执行程序时,却发现报错了!?libmyc.so不打开,不存在?为什么?

hyc@hyc-alicloud:~/linux/动静态库的制作$ ldd testlinux-vdso.so.1 (0x00007fff3f37a000)libmyc.so => not foundlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbfed7ba000)/lib64/ld-linux-x86-64.so.2 (0x00007fbfed9f1000)

        因为,我们只告诉了编译器gcc这些信息,但是并没有告诉操作系统!

        静态库为什么这问题?因为静态库在加载的时候,就已经将库加载到可执行程序里面了!而动态库没有,执行时还需要去查找对应的库。

解决方法:

        1.将我们写的库直接拷贝到操作系统中

        2.建立软连接:在操作系统中新建一个同名库,并将其与我们自己的库建立软连接

        3.创建/修改环境变量:LD_LIBRARY_PATH(导入库的路径)

        4.ldconfig方案:配置/ etc/ld.so.conf.d/ ,更新ldconfig

补充:

        1.动静态库同时提供,gcc/g++,默认是使用动态链接、动态库!

           非要静态链接,只能使用 -static(静态库必须存在!)

           只存在静态库,当然就默认静态链接了

        2.Linux下,默认优先安装动态库

http://www.xdnf.cn/news/18209.html

相关文章:

  • java之 junit4单元测试Mockito的使用
  • Pycharm Debug详解
  • 深度学习之优化器
  • 数据与模型融合波士顿房价回归建模预测
  • 数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
  • LeetCode 1323: 6和9组成的最大数字
  • 内网后渗透攻击--隐藏通信隧道技术(应用层隧道技术)
  • 一键管理 StarRocks:简化集群的启动、停止与状态查看
  • JAVA后端开发——Token自动续期机制的必要性
  • 库制作与原理(下)
  • RabbitMQ面试精讲 Day 24:消费者限流与批量处理
  • Linux中iSCSI存储配置与管理指南
  • Leetcode 15 java
  • 【LeetCode 热题 100】118. 杨辉三角
  • 使用Github Page发布网站
  • Compose笔记(四十六)--Popup
  • 廖雪峰-java教程-Part01
  • RK3588开发板Ubuntu系统烧录
  • 如何利用gemini-cli快速了解一个项目以及学习新的组件?
  • GitHub Copilot:AI编程助手的架构演进与真实世界影响
  • 【102页PPT】新一代数字化转型信息化总体规划方案(附下载方式)
  • 第七十九:AI的“急诊科医生”:模型失效(Loss Explode)的排查技巧——从“炸弹”到“稳定”的训练之路!
  • 为什么神经网络在长时间训练过程中会存在稠密特征图退化的问题
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月17日第163弹
  • 内网穿透系列十一:NPS 是一款轻量级、高性能、功能强大的内网穿透工具,自带Web管理端,支持Docker快速部署
  • Win10快速安装.NET3.5
  • Web全栈项目中健康检查API的作用(现代云原生应用标准实践)(health check、healthcheck、livenessProbe、健康探针)
  • 博士招生 | 香港大学 机器增强认知实验室 招收博士生/实习生/访问学生
  • File 类的用法和 InputStream, OutputStream 的用法
  • Python列表与元组:数据存储的艺术