【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.ogcc -shared -o $@ $^
.o:.cgcc -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指令,这样我们的可执行程序在运行时也能找到动态库了。

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

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

相关文章

如何监控特权帐户,保护敏感数据

IT基础设施的增长导致员工可以访问的凭据和资源数量急剧增加。每个组织都存储关键信息&#xff0c;这些信息构成了做出关键业务决策的基石。与特权用户共享这些数据可以授予他们访问普通员工没有的凭据的权限。如果特权帐户凭证落入不法分子之手&#xff0c;它们可能被滥用&…

使用WebRTC实现简单直播

WebRTC 是一个强大的实时通信技术&#xff0c;它允许用户直接在网页浏览器之间进行音视频通话和数据共享&#xff0c;无需任何外部插件。结合 WebSocket&#xff0c;我们可以构建一个简单的直播系统&#xff0c;让用户能够发布自己的实时视频流&#xff0c;同时允许其他用户观看…

请描述一下Velocity模板中的循环结构是如何工作的。Velocity有哪些内置的函数和方法?能否举例说明它们的使用场景?

请描述一下Velocity模板中的循环结构是如何工作的。 Velocity是一个基于Java的模板引擎&#xff0c;它允许开发人员使用简单的模板语言来引用由Java代码定义的对象&#xff0c;并在生成的文本中呈现这些对象。在Velocity模板中&#xff0c;循环结构用于遍历集合或数组&#xff…

【重学C语言】三、C语言最简单的程序

【重学C语言】三、C语言最简单的程序 最简单的程序头文件使用尖括号 < >使用双引号 ""区别与注意事项示例 主函数认识三个错误 常量和变量常量ASCII 码表转义字符 关键字数据类型关键字存储类关键字修饰符关键字控制流程关键字函数相关关键字其他关键字 变量变…

Python中批量修改文件名,去除某些内容

环境&#xff1a;Window10 Python3.9 PyCharm(2023.1.3) -------------------------------------****************** ** *********************----------------------------------------- 这是在Python中批量将指定文件夹下相似的文件名&#xff0c;提取文件名有效信息&am…

llama.cpp运行qwen0.5B

编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…

什么!Intel/AMD/Apple Silicon也能本地部署的Llama工具来了

主流的LLM都需要通过CUDA才能高效的运行在本地&#xff0c;但是随着Github上出现了Llama.cpp这个神器&#xff0c;一切都改变了。它通过AVX指令和MPI来实现CPU上并行计算&#xff0c;从而在本地计算机高效地运行各种主流的类Llama模型。同时它也支持metal&#xff0c;使得Apple…

保险项目的模块

用户管理模块 注册登录用户信息管理&#xff08;个人资料、密码重置等&#xff09;权限管理 保单管理模块 保单申请保单查询保单修改保单终止 理赔管理模块 理赔申请理赔审核理赔支付 保险产品管理模块 产品信息管理产品定价产品推广 支付与结算模块 支付方式管理保费…

go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案

一大早的GoLand就开始抽风了&#xff0c;好几个文件import都红了&#xff0c;于是我正常操作点击提示的sync&#xff0c;但是却报了一堆错&#xff1a; go: downloading google.golang.org/grpc v1.61.1 go: downloading google.golang.org/genproto v0.0.0-20240228224816-df9…

LeetCode-142. 环形链表 II【哈希表 链表 双指针】

LeetCode-142. 环形链表 II【哈希表 链表 双指针】 题目描述&#xff1a;解题思路一&#xff1a;快慢指针 判断是否有环见解题思路二&#xff1a;set()解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如…

C++重载和模板

重载与模板 函数模板可以被另一个模板或一个普通非模板函数重载。 与往常一样&#xff0c;名字相同的函数必须具有不同数量或类型的参数。 如果涉及函数模板&#xff0c;则函数匹配规则会在以下几方面受到影响&#xff1a; 对于一个调用&#xff0c;其候选函数包括所有模板…

2024第八届全国青少年无人机大赛暨中国航空航天科普展览会

2024第八届全国青少年无人机大赛暨中国航空航天科普展览会 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 为更好的培养空航天产业人才&#xff0c;汇聚航空教育产业创新科技&#xff0c;丰富和完善航…

某音a_bogus 流程vmp分析

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 仅研究。网站链接自己去找。 前言 这里a_bogus 又是个vmp。 还是个多层嵌套…

​LeetCode解法汇总1379. 找出克隆二叉树中的相同节点

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你两棵二叉树&#xff0c;原始树 origi…

[Arduino学习] ESP8266读取DHT11数字温湿度传感器数据

目录 1、传感器介绍 2、接线 3、DHT.h库 1、传感器介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;是简单环境监测项目的理想选择。 温度分辨率为1C&#xff0c;相对湿度为1&#xff05;。温度范围在0C到50C之间&#xff0c;湿度的测…

Protobuf 二进制文件学习及解析

0. 简介 protobuf也叫protocol buffer是google 的一种数据交换的格式&#xff0c;它独立于语言&#xff0c;独立于平台。google 提供了多种语言的实现&#xff1a;java、c#、c、go 和 python&#xff0c;每一种实现都包含了相应语言的编译器以及库文件。 由于它是一种二进制的…

新人程序员必备在线工具推荐(cron、加解密、JSON、AI)

程序员必备在线工具推荐 俗话说的好&#xff0c;工欲善其事必先利其器&#xff0c;下面我就来给大家分享一下我个人常用的工具。也欢迎大家在评论区分享自己喜欢的工具。✈️ 1 在线cron表达式&#xff1a;cron 在日常开发中&#xff0c;我们难免会遇到一些定时任务的场景&…

scala05-函数式编程02

函数式编程-函数对象作为方法的参数 package com.zishi.scala.a02.okk05/*** 将函数对象作为方法的参数来使用&#xff0c;* 函数本身就是对象&#xff0c;* 对象的使用领域&#xff1a;变量&#xff0c;方法参数&#xff0c;返回值类型** 类比Java* public void test(User us…

「每日跟读」句型公式 第2篇

「每日跟读」句型公式 第2篇 1. I’m thinking about____ 我在考虑____ I’m thinking about my future career (我正在思考我未来的职业) I’m thinking about our marriage (我在考虑我们的婚姻) I’m thinking about taking a vacation (我在考虑度一个假) I’m think…

tcpdump + wireshark 服务器抓包分析

tcpdump wireshark 服务器抓包分析 1.tcpdump安装2.tcpdump使用3.安装wireshark4.使用wireshark 本文用以总结使用tcpdump进行抓包&#xff0c;然后使用wireshark工具打开抓包出来的pacp文件进行分析。通过tcpdump可以实时监控到linux服务器中tcp和http、https等通讯的内容和信…