【Linux】详解动静态库的制作和使用动静态库在系统中的配置步骤

一、库的作用

1、提高开发效率,让开发者所有的函数实现不用从零开始。

2、隐藏源代码。

        库其实就是所有的.o文件用特定的方式进行打包形成一个文件,各个.o文件包含了源代码中的机器语言指令。

二、动态库和静态库的制作和使用

2.1、静态库的制作和使用

先将我们的.c文件或者是.cpp文件形成.o文件,指令为:

gcc/g++ -c 要形成的.o文件名 .c文件

        假设在我当前目录下有mystdio.o和mymath.o两个.o文件,要将这两个.o文件打包形成静态库,我们要用ar指令

ar -rc libmyc.a(名字,.a后缀表示静态库,真正的库名要去掉lib,去掉.a)mystdio.o mymath.o (跟上.o文件名)

         上面指令-rc中的r表示replace,c表示create,也就是说你要我形成的这个库如果原本没有,我就帮你形成一个新的库,如果有了那我就把你原来旧的库替换掉。

        此时在我当前路径下就有这个库了。但是,当我们去编译的时候,gcc编译器是不认识我们这个静态库的,gcc默认只能识别lib64目录下的C标准库,要让gcc链接我们的库,需要在指令中指明哪一个库让gcc链接。

gcc -o myexe(要形成的可执行文件名) test.c(所依赖的文件) -lmyc(指明要链接myc这个静态库) -L .(-L + 路径表示myc这个库在哪个路径下)

 

2.2、动态库的制作和使用

fPIC:产生位置无关码,在将.c或者.cpp形成.o文件时,需要加上-fPIC。要形成动态库必须加上-fPIC。

 加上-fPIC同样可以形成.o文件。

形成动态库不需要用到其它指令,gcc编译器就可以形成动态库,只不过要加上-shared命令。

gcc -shared -o libmyc.so(名字,真正的库名要去掉lib和.so) mystdio.o mymath.o(所依赖的.o文件) 

         但如果直接使用我们的这个动态库,同样会和我们之前使用静态库一样发生链接错误。那么就同样要告诉编译器我们库的名字和所在的路径(参考上面静态库路径的写法)。

        但是,在ubuntu系统下你会发现,动态库使用静态库的链接方法我们的动态库系统还是找不到(此处特制ubuntu系统,其它系统可能可以正常运行),这时我们就只能将我们的动态库拷贝到系统的usr/lib目录下,因为系统默认寻找库的时候回到/usr/lib目录下找。  

 此时在运行我们的程序就能正常运行了,但要注意的是,在指令的最后我们必须指明我们要链接的库,因为这个库是我们自己导到系统中的,需要我们自己指明链接

三、将自己的库打包交给别人

         假设在我当前目录下有libmyc.so动态库,mymath.h,mystdio.h两个头文件,如果我想将这三个文件一起交给别人,就可以把它们打包一起放在一个目录下,一起压缩完再交给别人。

 在这里我将指令全部放在makefile中

libmyc.so:mystdio.o mymath.o
        gcc -shared -o $@ $^
.o:.c
        gcc -shared -c $<
#mystdio.o:mystdio.c
#       gcc -c -fPIC $< -o $@
#mymath.o:mymath.c
#       gcc -c -fPIC $< -o $@
.PHONY:clean
clean:
        rm -f *.o libmyc.so

.PHONY:output
output:
        mkdir -p ./user/mylib/
        mkdir -p ./user/Headfile/
        cp -rf libmyc.so ./user/mylib/
        cp -rf mystdio.h mymath.h ./user/Headfile/
        tar -czf user.tgz user

四、运行别人给我的库文件和头文件 

        假设我自己收到了别人的压缩文件,里面有头文件和库文件,我想使用可以将头文件拷贝到usr/include目录下,将库文件拷贝到usr/lib目录下,最后指定链接哪一个库,就可以使用了。

        现在假设user目录是通过user.tgz解压得到的,下面是user目录下的文件:

        将两个头文件拷贝到usr/include目录下(编译器默认会到include目录下去寻找头文件),将库文件拷贝到usr/lib目录下,编译时指定库链接,就能够运行了。当然了包含main函数的文件要自己写啦!

如果今天我不将我的库文件和头文件拷贝到系统中,则需要:

gcc -o myexe test.c -I ./user/Headfile/(-I + 路径指明要去哪里找头文件) -L ./user/mylib/ -lmyc(-L + 路径 + 库名指明要去哪里找哪一个库)

        如果是这样去做我们会发现编译是能通过的,但当我们要运行我们的可执行程序时,会发现还是找不到库。因为-L只是告诉gcc编译器动态库在哪里,但没有告诉系统动态库在哪里,所以在要运行时系统会找不到动态库。

 那如何解决呢?

方法1:添加环境变量LD_LIBRARY_PATH的搜索路径

LD_LIBRARY_PATH变量在你的系统中可能有也可能没有,如果没有自行导入就行。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/sxb/240402/user/mylib(冒号后紧跟你的动态库所在的路径)

         但是因为命令行export是导入到系统内存级别的环境变量中,下次登录系统又会从磁盘配置文件中重新读取环境变量,所以如果要让你配置的这个LD_LIBRARY_PATH环境变量永久生效需要将其配置到.bashprofile文件或者.bashrc文件中。

方法2:通过软链接方式

        在usr/lib目录下建立一个与我们的动态库同名(记住必须要同名)的软链接文件,这样修改的是系统文件,是永久存在的。

方法3:修改加载动态库的配置文件

        在系统这个目录/etc/ld.so.conf.d/下(ld:load加载,so动态库,conf配置文件,d目录),建立.conf后缀的配置文件,文件里面只需要存放动态库的路径即可,系统在寻找动态库的时候默认就会帮我们搜索该目录下的配置文件中所保存的路径。

        在该目录下创建一个我们自己的.conf后缀的文件

        然后只需要在该文件中保存我们的动态库所在的路径 

 

        然后需要让系统知道/etc/ld.so.conf.d/下的文件被修改过了,需要执行ldconfig指令,这样我们的可执行程序在运行时也能找到动态库了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DTFT及其反变换的直观理解

对于离散时间傅里叶变换(DTFT)及其反变换的讲解&#xff0c;教材里通常会先给出DTFT正变换的公式&#xff0c;再举个DTFT的简单变换例子&#xff0c;推导一下DTFT的性质&#xff0c;然后给出DTFT反变换的公式&#xff0c;再证明一下正变换和反变化的对应关系。总的来说就是&…

波士顿房价预测案例(python scikit-learn)---多元线性回归(多角度实验分析)

波士顿房价预测案例&#xff08;python scikit-learn&#xff09;—多元线性回归(多角度实验分析) 这次实验&#xff0c;我们主要从以下几个方面介绍&#xff1a; 一、相关框架介绍 二、数据集介绍 三、实验结果-优化算法对比实验&#xff0c;数据标准化对比实验&#xff0…

南京观海微电子---Vitis HLS的工作机制——Vitis HLS教程

1. 前言 Vitis HLS&#xff08;原VivadoHLS&#xff09;是一个高级综合工具。用户可以通过该工具直接将C、 C编写的函数翻译成HDL硬件描述语言&#xff0c;最终再映射成FPGA内部的LUT、DSP资源以及RAM资源等。 用户通过Vitis HLS&#xff0c;使用C/C代码来开发RTL IP核&#x…

大疆御Pro(一代)更换晓spark摄像头评测

御Pro是17年的老机器&#xff0c;除了摄像头有点拉跨&#xff0c;续航、抗风、操作性在大疆民用系列里面算是数得上的。 机缘巧合&#xff0c;手头有几个御的空镜头&#xff08;里面的芯片已经去掉了&#xff09;&#xff0c;还有几个晓的摄像头&#xff08;只有芯片&#xff0…

Java基础入门--面向对象课后题(2)

文章目录 1 Employee2 SalariedEmployee3 HourlyEmployee4 SalesEmployee5 BasePlusSalesEmployee6 测试类 Example177 完整代码 某公司的雇员分为5类&#xff0c;每类员工都有相应的封装类&#xff0c;这5个类的信息如下所示。 (1) Employee&#xff1a;这是所有员工总的父类。…

网站可扩展架构设计——领域驱动设计(下)

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、架构设计简述 1.经典分层图 DDD分层架构的重要原则&#xff1a;每层只能与位于其下方的层发生耦合 User Interface —— 接口/用户界面层。提…

linux0.11中jmpi 0,8解析

系统在执行该行代码时已经为保护模式, jmpi 0,8会将段选择子(selector)载入cs段寄存器&#xff0c;并计算出逻辑地址。 段选择子的结构如下&#xff1a; 段选择子包括三部分&#xff1a;描述符索引&#xff08;index&#xff09;、TI、请求特权级&#xff08;RPL&#xff09;。…

拯救者Legion R9000X 2021(82HN)原装出厂Win10系统镜像ISO下载

lenovo联想拯救者笔记本R9000X 2021款原厂Windows10系统安装包&#xff0c;恢复出厂开箱状态预装OEM系统 链接&#xff1a;https://pan.baidu.com/s/1tx_ghh6k0Y9vXBz-7FEQng?pwd7mih 提取码&#xff1a;7mih 原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标…

《QT实用小工具·十》本地存储空间大小控件

1、概述 源码放在文章末尾 本地存储空间大小控件&#xff0c;反应电脑存储情况&#xff1a; 可自动加载本地存储设备的总容量/已用容量。进度条显示已用容量。支持所有操作系统。增加U盘或者SD卡到达信号。 下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #if…

2024 蓝桥打卡Day31

递归与辗转相除法 递归&#xff08;Recursion&#xff09;辗转相除法&#xff08;Euclidean Algorithm&#xff09;总结 递归&#xff08;Recursion&#xff09; 递归是指一个函数在执行过程中调用自身的过程。在编程中&#xff0c;递归函数在遇到满足某个条件时会停止调用自身…

Servlet原理Servlet API

目录 一、Servlet运行原理 1.1、问题 1.2、Servlet的具体执行过程 1.3、Tomcat初始化流程小结 1.4、Tomcat处理请求流程 二、Servlet API详解 2.1、HttpServlet类 2.1.1、处理Get请求 2.2、HttpServletRequest类 2.3、HttpServletResponse类 2.3.1、设置状态码 ​2.…

wsl.conf在windows的什么路径

结论 全局的.wslconfig找不到。 局部的wsl.conf在ubuntu中的/etc/wsl.conf。 官网 https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config .wslconfig 使用 .wslconfig 为 WSL 上运行的所有已安装的发行版配置全局设置。 默认情况下&#xff0c;.wslconfig 文件不存在。…

Hadoop MapReduce

MapReduce分为两个阶段&#xff0c;分为Map阶段和Reduce阶段&#xff0c;可以自定义map函数和reduce函数&#xff0c; map函数的输入是行在文件的字节偏移量&#xff0c;value是文件的一行数据。 reduce函数的输入是key和对应key的value组&#xff0c;然后reduce函数可以对这…

【Linux】SSH协议应用

SSH协议 SSH简介实现OpenSSH ssh中的四个文件~/.ssh文件路径实验解析 SSH 简介 SSH&#xff08;secure shell&#xff09;只是一种协议&#xff0c;存在多种实现&#xff0c;既有商业实现&#xff0c;也有开源实现。本文针对的实现是OpenSSH&#xff0c;它是自由软件&#xf…

面试题:RabbitMQ 消息队列中间件

1. 确保消息不丢失 生产者确认机制 确保生产者的消息能到达队列&#xff0c;如果报错可以先记录到日志中&#xff0c;再去修复数据持久化功能 确保消息未消费前在队列中不会丢失&#xff0c;其中的交换机、队列、和消息都要做持久化消费者确认机制 由spring确认消息处理成功后…

字符分类函数

字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。这些函数的使用都需要包含⼀个头文件是 ctype.h 这些函数的使用方法非常类似&#xff0c;我们就讲解⼀个函数的事情&#xff0c;其他的非常类似&#xff1a; int i…

蓝桥杯速成5-AD/DA模数转换

一、原理图 上图可知该芯片使用的是iic时序&#xff0c;而不是51单片机的xpt2046时序&#xff0c;iic我们都很熟悉了吧 并且大赛还提供了我们iic底层驱动代码 左上角有AIN0-4四个转换输入通道&#xff0c;和AOUT一个输出通道&#xff0c;由控制字节选择 地址字节&#xff1a;0x…

Linux性能分析工具-perf并生成火焰图

1 简介 perf 是一个非常实用且深入的性能分析工具&#xff0c;适用于从底层硬件交互到上层应用程序逻辑的全方位性能剖析。 perf 工具的设计目的是为了帮助开发者和系统管理员分析应用程序以及内核本身的性能&#xff0c;寻找潜在的性能瓶颈&#xff0c;并据此进行针对性的优…

向上转型与向下转型

首先&#xff0c;一个对象在new的时候创建是哪个类型的对象&#xff0c;它从头至尾都不会变。即这个对象的运行时类型&#xff0c;本质的类型用于不会变。但是&#xff0c;把这个对象赋值给不同类型的变量时&#xff0c;这些变量的编译时类型却不同。 7.6.1 为什么要类型转换 …

实景三维技术在推进城市全域数字化转型的作用

4月2日&#xff0c;国家数据局发布《深化智慧城市发展推进城市全域数字化转型的指导意见&#xff08;征求意见稿&#xff09;》&#xff08;下称&#xff1a;《指导意见》&#xff09;&#xff0c;向社会公开征求意见。 《指导意见》作为推进城市数字化转型的重要文件&#xf…