关于Linux的动静态库

news2025/2/2 2:52:12

文章目录

  • 什么是动静态库
  • 生成静态库
    • 生成
    • 发布
  • 生成动态库
    • 发布
  • 使用库
    • 使用静态库
      • 查看系统头文件路径
      • 查看系统库文件路径
      • 使用库文件和头文件
      • 指定路径搜索头文件
      • 卸载库
    • 使用动态库
      • 动态库的运行搜索路径


什么是动静态库

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静
    态库
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间

安装C语言静态库

yum install -y glibc -static


生成静态库

首先我们库里面是不需要包含main函数的!
链接:就是把所有的.o链接形成一个可执行程序!!!
如果我把我的所有的.o给别人,别人能链接使用吗??—> 当然是可以的!

测试程序

/mymath.h//
#pragma once
#include<stdio.h>
#include<assert.h>
//[from,to]-->累加-->result--->return
extern int addToVal(int from,int to);

/mymath.c//
#include"mymath.h"
int addToVal(int from,int to)
{
    assert(from<=to);
    int result=0;
    for(int i=from;i<=to;i++)
    {
        result+=i;
    }
    return result;
}

/myprint.h//
#pragma once
#include<stdio.h>
#include<time.h>
extern void Print(const char* msg); 

/myprint.c//
#include"myprint.h"
void Print(const char* msg)
{
    printf("%s : %lld\n",msg,(long long)time(NULL));
}

生成

命令

ar -rc [文件]
(ar是gnu的归档工具,rc表示(replace and create))

libmymath.a:mymath.o myprint.o
	ar -rc libmymath.a mymath.o myprint.o
mymath.o:mymath.c
	gcc -c mymath.c -o mymath.o -std=c99
myprint.o:myprint.c
	gcc -c myprint.c -o myprint.o -std=c99
.PHONY:clean
clean:
	rm -f *.o *.a

发布

问题:我们在用库的时候需要什么东西呢??

答:库文件和头文件!!—>就可以给别人使用了

命令

.PHONY:static
static:
	mkdir -p lib-static/lib;\
	mkdir -p lib-static/include;\
	cp *.a lib-static/lib;\
	cp *.h lib-static/include

生成动态库

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码(position independent code)—>以后编译的源代码无论生成的.o文件在哪里都可以执行
  • 库名规则:libxxx.so
libmymath.so:mymath.o myprint.o
	gcc -shared -o libmath.so mymath.o myprint.o
mymath.o:mymath.c
	gcc -fPIC -c mymath.c -o mymath.o -std=c99
myprint.o:myprint.c
	gcc -fPIC -c myprint.c -o myprint.o -std=c99

.PHONY:clean
clean:
	rm -rf *.o *.so

发布

.PHONY:dyl
dyl:
	mkdir -p lib-dyl/lib;\
	mkdir -p lib-dyl/include;\
	cp *.so lib-dyl/lib;\
	cp *.h lib-dyl/include


使用库

使用静态库

#include"mymath.h"
#include"myprint.h"

int main()
{
    int start=0;
    int end=100;
    int result=addToVal(start,end);
    printf("%d\n",result);

    Print("hello world");
    return 0;
}

首先我们先来回顾C语言头文件的搜索路径: “” <>

  • “” 在当前路径下查找头文件
  • <> 在系统头文件路径下查找头文件
  • 指定路径头文件的搜索路径(-I(include) 你的头文件搜索路径 -L(link) 你的库路径 -l 具体哪一个库文件)
    谁在头文件呢???—>编译器---->进程

查看系统头文件路径

ls /usr/include/
在这里插入图片描述

查看系统库文件路径

ls /lib64/
在这里插入图片描述

使用库文件和头文件

将自己的头文件和库文件,拷贝到系统路径下即可!!!(库的安装)

sudo cp lib-static/include/* /usr/include/
sudo cp lib-static/lib/* /usr/lib64/

gcc -l(指明我要链接的第三方库的名称)

但是不推荐这种做法,因为这种做法会污染系统的头文件和库文件!

指定路径搜索头文件

gcc mytest.c -o mytest -I ./lib-static/include/

在这里插入图片描述

卸载库

sudo rm /usr/include/mymath.h
sudo rm /usr/include/myprint.h
sudo rm /lib64/libmymath.a

使用动态库

第一种方法和静态库的使用一模一样:将自己的头文件和库文件,拷贝到系统路径下即可!!!

这里就不做演示了!

第二种指定路径包含头文件和库文件

编译的时候gcc所带的-I,-L,-l选项是给谁带的? ---->gcc
所以形成可执行程序后,与编译器gcc就没有任何关系了。
所以./mytest运行进程后,并没有告诉进程这个库链接在哪里!!

动态库的运行搜索路径

根据上面的问题,进程找不到对应的动态库!

  • 那么静态库的时候,怎么没有这个问题呢?–>形成可执行程序之后,已经把需要的代码拷贝进我的代码中!运行时不依赖你的库!—>不需要运行时查找了
  • 为什么动态库会有这个问题呢? 程序和动态库是分开加载的!

那么如何解决找不到动态库的问题呢??想办法让进城找到动态库即可!

  • 动态库拷贝到系统路径下/lib64/ —>安装
  • 通过导入环境变量的方式---->程序运行的时候,会在环境变量中查找自己需要的动态库路径(LD_LIBRARY_PATH)
  • 系统配置文件来做
  • 其他方式(添加软连接)

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

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

相关文章

再携手,齐并进!菊风助力宁波银行坐席PUSH外呼项目

随着“金融数字化”逐步成为金融行业的新浪潮&#xff0c;运用更加灵活的触达手段提升营销效果&#xff0c;促成业务闭环愈发成为银行业等金融机构角逐数字化转型成功的关键。 在此背景下&#xff0c;金融机构对于实时音视频技术的应用也从普遍的「呼入」需求逐步扩展到创新的…

LinkedHashSet源码解析

LinkedHashSet源码解析 问题 &#xff08;1&#xff09;LinkedHashSet 的底层使用什么存储元素&#xff1f; &#xff08;2&#xff09;LinkedHashSet 与 HashSet 有什么不同&#xff1f; &#xff08;3&#xff09;LinkedHashSet 是有序的吗&#xff1f; &#xff08;4&a…

Vue2与Vue3 setup的使用差异与对比

最近一直在做vue2的技术栈升级&#xff0c;于是心血来潮&#xff0c;就想要不写篇文章总结一下vue2和vue3在使用上的不同吧&#xff0c;于是乎&#xff0c;我们这就开始吧&#xff01; 首先说明一下&#xff0c;vue3有多种写法&#xff0c;本文使用setup语法糖&#xff0c;不考…

硬核!Github 星标 79.4K 的阿里强推 Java 面试参考指南到底有多强?

谈到 Java 面试&#xff0c;相信大家第一时间脑子里想到的词肯定是金三银四&#xff0c;金九银十。好像大家的潜意识里做 Java 开发的都得在这个时候才能出去面试&#xff0c;跳槽成功率才高&#xff01;但 LZ 不这么认为&#xff0c;LZ 觉得我们做技术的一生中会遇到很多大大小…

组件技术--设计--jsp+servlet+bean+MySQL 简单的登录注册案例

JavaBeanMySQLjspservlet 简单的登录注册案例登录注册案例需求核心系统组成Javaweb项目框架基本思想BeancounterUserDaoUserDaoservletLoginCljspindex.jspLoginServlet.jspregister.jspregisterMessage.jspwelcome.jsptargetpom.xmlWEB-INFweb.xml登录注册案例需求 本项目利用…

【论文阅读笔记】CycleISP: Real Image Restoration via Improved Data Synthesis

论文地址&#xff1a;https://arxiv.org/abs/2003.07761 代码地址&#xff1a;https://github.com/swz30/CycleISP 论文小结 总的来说&#xff0c;就是现实世界中无法获取有效的图像对。且之前合成噪声的方式是在sRGB上添加高斯白噪声&#xff0c;但对于相机传感器成像管道来说…

工控CTF之协议分析7——OMRON

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

同源策略跨域

目录1.同源策略限制的意义1.请求协议 均为 http2.主机此这为 localhost3.端口号不同 一个 8080 一个 50002.注意3.解决跨域代理服务器 80801.同源策略限制的意义 让前端发送的请求不能随意访问其他端口的服务器&#xff0c;一定程度保护服务器和用户的隐私 1.请求协议 均为 …

nexus上传jar包

nexus上传自定义starter1、普通jar包和springboot的starter1.1、starter上传简介1.2、上传方法2.1.1、setting.xml文件2.1.2、项目中的pom文件1.3、具体部署2、父pom文件上传这里我们主要讲解两种&#xff0c;一种是jar包上传&#xff0c;包含普通jar包和springboot的starter包…

jmeter简单压力测试

测试目的&#xff1a;10个用户并发访问一个接口&#xff08;http://127.0.0.1:8080/dfm/login.action&#xff09;&#xff0c;能否正常响应。 一、打开JMeter 二、右击“测试计划”&#xff0c;添加线程组 三、设置线程组的线程数 JMeter中的线程组&#xff0c;类似于LoadRunn…

RCTFweb复现

文章目录filechecker_minieasy_uploadfilechecker_plusfilechecker_pro_maxezbypassezruoyifilechecker_mini 给了附件&#xff0c;代码比较短&#xff0c;先审计一下。 在这里发现了file –b命令&#xff0c;且filepath部分可控&#xff0c;明显的ssti漏洞&#xff0c;没过…

Clickhouse引擎之kafka

Clickhouse kafka引擎需要结合kafka使用&#xff0c;需要确保已经安装clickhouse和kafka 实战环境&#xff1a; Clickhouse-server 版本&#xff1a;22.4.5 Kafka版本&#xff1a;kafka_2.13-3.2.0 Clickhouse数据库执行&#xff1a; 1、使用引擎创建一个kafka消费者 CREA…

【OpenCV+Qt】使用车牌识别系统EasyPR识别车牌号

EasyPR是一个中文的开源车牌识别系统&#xff0c;其车牌识别划分为了两个过程&#xff1a;即车牌检测&#xff08;Plate Detection&#xff09;和字符识别&#xff08;Chars Recognition&#xff09;两个过程&#xff1a; 车牌检测&#xff08;Plate Detection&#xff09;&am…

用于医疗诊断的花青染料ICG-Sulfo-EG8-OSu,

凯新生物产品介绍&#xff1a; (ICG)是一个用于医疗诊断的花青染料。它是用于测定心输出量、肝脏功能、肝血流量,和对于眼科血管造影术。它有一个最大吸收光谱在800nm附近。这些红外波段可以穿透视网膜层,相比荧光素血管造影ICG血管造影图像允许进入更深的血液循环。传统的激活…

华为机试_HJ24 合唱队【中等】【收藏】

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解题过程 提交代码 学习代码 代码一 代码二 收藏点 描述 N 位同学站成一排&#xff0c;音乐老师要请最少的同学出列&#xff0c;使得剩下的 K 位同学排成合唱队形。 设KK位同学从左到右依次编号为 1&#xff0…

想学Redis却不会安装,这有一个快速入门请拿去

一. Redis简介 1.什么是Redis Redis是一个完全开源免费、且遵守BSD协议的&#xff0c;高性能(NOSQL)的key-value数据库。Redis本身使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型&#xff0c;并提供多种语言的API。 2.Redis特点 Redis具有如下特点&#xff1…

DJ13-2 汇编语言程序设计

目录 一、顺序程序设计 二、分支程序设计 1. 用比较/测试命令条件转移指令实现分支 2. 采用跳转表实现多路分支 三、循环程序设计 1. 计数循环程序设计 2. 条件判断循环程序设计 四、子程序设计 1. 子程序设计举例 2. 主程序和子程序设计举例 一、顺序程序设计 举例…

低代码为什么会受到企业青睐?是何原因?

低代码为什么会受到企业青睐&#xff1f;是何原因&#xff1f;回答这个问题&#xff0c;只需用4个“更”字&#xff0c;就能很好的概括。 1、更快&#xff08;开箱即用&#xff09; 2、更省&#xff08;人力、时间成本&#xff09; 3、更合适&#xff08;需求贴合业务&#…

mfc常用控件

mfc在编写桌面客户端应用应用程序&#xff0c;在设计界面时&#xff0c;如果像一般的界面&#xff0c;实施人员或者适配人员使用(特定的用户群体)对界面要求没有那么高&#xff0c;只要软件功能正常&#xff0c;稳定就行&#xff0c;我们在做这些界面时&#xff0c;通常使用原生…

CSDN第16期竞赛

目录 1.比赛详情 2.竞赛感悟 3.竞赛题目回顾 &#xff08;1&#xff09;鬼画符门莲台争夺战 (2)津津的储蓄计划 &#xff08;3&#xff09;多边形的面积 (4)小桥流水人家 1.比赛详情 比赛地址&#xff1a;http://t.csdn.cn/b1Lzm 2.竞赛感悟 通过这次的周赛&#xff0c…