【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.pswp.cn/diannao/95868.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95868.shtml

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

相关文章

链式二叉树的基本操作——遍历

本文笔者将带领读者一起学习链式二叉树的一些基本语法,至于更难一些的插入删除等,笔者将在后续C更新后再次详细带领大家学习。 首先,在进行二叉树之前,我们需要一颗二叉树,而二叉树的初始化现阶段实现不太现实&#x…

Windows运维之以一种访问权限不允许的方式做了一个访问套接字的尝试

一、问题场景 在Windows 上运维服务过程中,经常会遇到运行服务,部署安装时候无任何问题,后续再某个特殊时间点,突然服务无法启动了。再次启动时,提示端口占用与以一种访问权限不允许的方式做了一个访问套接字的尝试。 …

2020/12 JLPT听力原文 问题二 3番

3番:レストランで、女の人と店長が話しています。店長はサラダについて、どんなアドバイスをしていますか。女:店長、この前話してた新しいランチメニューのサラダを作ってみたんですが、どうでしょうか。 男:ああ、サラダだけで満足できるっ…

芯片行业主要厂商

作为一个小白,每次淘宝买芯片时看到相似的命名规则:“OPA、AD、LT、MAX”等等时,我不禁好奇这些芯片行业大厂有哪些,所以查了些资料: 1. 德州仪器(Texas Instruments, TI) 公司概况&#xff1…

【BLE系列-第四篇】从零剖析L2CAP:信道、Credit流控、指令详解

目录 引言 一、L2CAP主要功能 二、L2CAP帧格式及信道概念 2.1 逻辑链路是什么? 2.2 逻辑信道的作用 2.3 L2CAP帧格式介绍 三、L2CAP信令信道 3.1 信令信道帧格式说明 3.2 信令信道指令介绍 3.2.1 信令信道指令一览表 3.2.2 Credit流控规则 引言 在BLE协…

CSS保持元素宽高比,固定元素宽高比

方法一&#xff1a; <div class"hcp-fixed-aspect-ratio-box">这里是正文内容 </div>.hcp-fixed-aspect-ratio-box {width: 50%;color: #FFFFFF;margin: 100px auto;background: #FF0000;/* 宽高比2:1&#xff0c;兼容性可能不太好 */aspect-ratio: 2 / …

数据分析小白训练营:基于python编程语言的Numpy库介绍(第三方库)(上篇)

&#xff08;一&#xff09;Numpy库的安装安装指定版本的Numpy库&#xff0c;打开命令提示符&#xff0c;输入下图内容&#xff0c;只需要将1.25.5的版本修改成个人需要的版本&#xff0c;然后按下回车键&#xff0c;numpy库就安装在python中&#xff1a;指定版本numpy库安装可…

从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)

一、准备工作 1. 环境说明 本地开发环境&#xff1a;Windows 服务器&#xff08;需执行部署脚本&#xff09;目标服务器&#xff1a;Linux 服务器&#xff08;需安装 node.js、pm2、unzip&#xff09;核心工具&#xff1a;7-Zip&#xff08;压缩&#xff09;、OpenSSH&#x…

智能汽车领域研发,复用云原始开发范式?

汽车电子电气架构演进趋势&#xff1a;分散的功能ECU -> 域控制器 -> 中央计算服务器汽车电子方案与架构在发展与迭代时会使用虚拟化方法几种可行的软硬一体化方案&#xff1a;多ECU&#xff0c;硬件隔离&#xff0c;硬件分区&#xff0c;车规级多核硬件架构 Hypervisor…

数据电台询价的询价要求

技术规格及主要参数 1.电台基本要求&#xff1a; 1.1 电台中的信号处理基于FPGA设计&#xff0c;采用FPGAARM高速AD/DA设计架构&#xff1b; 1.2 具备频谱感知、自主选频、跳频、扩频等功能&#xff1b; 1.3 具备链路质量信息、自组网路由信息、电池电压监测信息、北斗定位信息…

IoT/HCIP实验-5/基于WIFI的智慧农业实验(LwM2M/CoAP+PSK+ESP8266 连接到 IoTDA)

文章目录概述WIFI8266 通信模组WIFI模组也用AT指令&#xff1f;ESP8266 内置协议栈?支持的无线网络模式MCU通过串口与模组交互Wifi模组做客户端PC-AT接入路由器向本地TCP服务发数据用代码接入你家路由器已接入AP&#xff08;你家Wifi&#xff09;平台侧开发工程配置和编译工程…

定时器输出PWM波配置(呼吸灯)

使用定时器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;实现呼吸灯效果。 频率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499pwm.c:#include "pwm.h" // 本模块头文件&#xff1a;应声明 pwm_init/pwm_compare_set 等原型、并包含 HAL 头//&#xff08;示…

[ai-agent]环境简介之沙盒e2b vs daytona

所谓的环境的就是agent运行在哪里&#xff0c;或者是agent和那里进行交互。 最常见的环境就是本地开发环境&#xff0c;也就是个人主机&#xff0c;但是存在问题就是没有办法出网和横向扩展。 在沙盒之前也是有其他选择的&#xff1a; 云服务器&#xff0c; 虚拟机&#xff0c;…

【前端面试题】前端面试知识点(第三十一题到第六十一题)

三十一. CSS实现垂直水平居中 实现元素的垂直水平居中是前端开发中的常见需求,主要有以下几种思路: text-align + line-height实现单行文本水平垂直居中 适用于单行文本元素,通过text-align: center实现水平居中,line-height等于容器高度实现垂直居中 text-align + vertic…

嵌入式练习项目——————抓包获取天气信息

一、内容 尝试通过实时天气接口 - 数据接口 - NowAPI此网站获取天气信息&#xff0c;实现可以发送城市查询当前天气和未来天气 二、获取请求报文 可以根据测试示例看到获取内容&#xff0c;此时数据是cJSON格式&#xff0c;我们首先要通过合适的网址抓包获取到请求报文&#x…

Python爬虫实战:研究NewsCrawl ,构建新浪和网易新闻数据采集系统

1. 引言 1.1 研究背景与意义 在信息时代,新闻作为社会动态、公众观点的重要载体,其传播速度与影响力持续扩大。传统的人工筛选与采集方式已无法满足对海量新闻数据的高效处理需求,亟需自动化工具实现大规模、结构化的新闻数据采集。网络爬虫技术作为一种按照预设规则自动抓…

PyTorch神经网络工具箱全解析:nn.Module vs nn.functional

&#x1f50d; 为何需要神经网络工具箱&#xff1f; 在仅用 Autograd 和 Tensor 实现模型时&#xff0c;开发者需手动设置参数梯度&#xff08;requires_gradTrue&#xff09;、反向传播&#xff08;backward()&#xff09;及梯度提取&#xff0c;过程繁琐且易出错。nn 工具箱应…

Java注解学习记录

目录 一、为什么要学注解&#xff1f; 二、注解是什么&#xff1f; 三、为什么要使用注解&#xff1f; 四、注解的作用 五、注解的分类 5.1 元注解 Retention&#xff08;/ rɪˈtenʃ(ə)n /&#xff09; ★★★★★ Target ★★★★★ Inherited(/ ɪnˈherɪtɪd /…

43.安卓逆向2-补环境-使用unidbg(使用Smali语法调用方法和使用方法地址调用方法)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

【Kubernetes知识点问答题】Pod 调度

1. 如何将特定 Pod 调度到指定的节点&#xff1f;可以使用下列方法中的任何一种来选择 K8s 对特定 Pod 的调度&#xff1a;① 与节点标签匹配的 nodeSelector&#xff1a;在 Pod 的规范中使用 nodeSelector 字段来指定节点标签&#xff0c;以便将 Pod 调度到具有特定标签的节点…