静态库与动态库的制作和使用

news2024/11/24 18:28:53

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

前言

库?

为什么要使用库

静态库

静态库的制作和使用

动态库

动态库的制作和使用

四种方法:

直接将库拷贝(安装)到系统路径中

配置环境变量

软链接

添加配置文件

动态库和静态库同时存在

总结


前言

首先提到,我们用过库吗?C语言,C++其实我们一直都在使用库,你一定听说过C标准库,博主这里介绍动静态库使用的是云服务器,在云服务器上,默认安装的是动态库,静态库默认是没有安装的,我们默认编译程序,链接的是动态库,如果想要链接静态库,需要安装,并加上static选项,我们举例来说明:

首先,我们来安装C静态库(博主已经安装了)

sudo yum install glibc-static

接着就是C++静态库

sudo yum install libstdc++-static

我们随便写一个C文件,然后先进行编译:

我们使用gcc编译器,默认就是使用动态库进行链接,接着我们使用ldd查看可执行程序链接的是什么库,我们可以看到链接的是libc.so.6这个库,查看库的名字,就是去掉前缀lib,去掉后缀so.6,这个库的名族就叫c,也就是我们的C标准库,而在linux下,.so是动态库的后缀,.a是静态库的后缀。

接着我们对这个文件进行静态编译:

gcc 文件名 -static

我们可以看到,ldd已经无法查看这个文件,那么我们使用file指令来查看这个文件,可以清楚的看到statically linked,这就是静态链接的意思。

库?

为什么要使用库

我们先来准备一些文件:

我们实现了加减乘除。

如果说,这些文件要给别人使用,那么如果没有库,他们会怎么使用?是这样:

当然,我们也可以这样:

如果说有更多的文件呢?成百上千个的话,难道一个个的敲吗?所以我们需要库,库就是将这些.c文件编译后形成的.o文件打包乘一个文件,然后我们进行使用。

静态库

静态库的制作和使用

我们先新建一个目录,将所有.c和.h文件拷贝进来,接下来我们将制作一个静态库。(在我们给交付别人时,当然是不想给他发源文件的,但是我们可以给他发.o文件和头文件,他照样可以使用,但是文件太多别人用着也麻烦,所以我们就将这些文件打包成库)

ar -rc 文件

我们将这些文件一次性打包后并发布:

上面第一行代码,意思是将.c文件全部替换成.o文件,wildcard意思是寻找所有.c文件,下面的%.o:%.c和下面一行代码意思是寻找所有.c文件编译成,o文件。

output就是我们要进行的打包操作。

我们来看make后效果:

接着我们进行打包:

假设我们有个user目录,将这个包给给用户,用户有个test.c文件,那么用户怎么使用呢?

首先进行解包:

tar -zxf 包名

我们在进行与静态库的链接时,如果我们的库和头文件不在当前目录,头文件路径需要使用-I(大i)指明,库路径需要使用-L指明,同时需要使用-l(小L)指明链接的库的名字。

或者指明头文件路径后,给出库路径和库的全称(不要去掉前后缀),这样就相当于给了路径和库名,也是可以的。

动态库

动态库的制作和使用

生成动态库需要的.o文件需要进行特殊处理:

我们加上-fPIC选项,同时生成动态库不需要其他指令,使用gcc就可以,加上-shared选项。

下面这种情况我们怎么办?同时,为什么静态库这样链接后,运行时没有这样的报错?

四种方法:

头文件搜索路径:

  • 当前路径 
  • 系统默认路径:/usr/include

库搜索路径:

  • 由环境变量 (LD_LIBRARY_PATH) 辅助搜索(动态库) 
  • 系统指定路径:/lib64  或者 /usr/lib64

直接将库拷贝(安装)到系统路径中

我们这样做,在生成可执行程序时,也不需要指定库路径,在执行时,当然也不需要,但是,非官方库不要安装在系统目录下。

 

配置环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:我们的路径 

但是这样做的话只是临时添加,当我们再次登录时,环境变量从配置文件读取,我们还是没有永久添加。

我们可以这样做:

我们可以在这里面修改,下次登录时环境变量读取配置文件,我们也就不用再去添加了。

软链接

现在我们对库进行软链接,并安装在系统目录下。

删除:

添加配置文件

/etc/ld.so.conf.d/

我们添加一个后缀为.conf的文件,将库路径写进文件中即可。

注意:需要提权打开系统文件,否则无法进行写入

但是我们发现还是找不到,这是因为我们修改了配置文件,操作系统并不清楚,所以我们需要执行一条命令来使刚刚的命令生效

动态库和静态库同时存在

如果动静态库同时存在,那么gcc默认使用的是哪个库呢?

很显然,两者同时存在时,gcc默认选择使用动态库。

如果我们一定要静态链接,需要加上-static选项:

如果我们只提供静态库,那么他只能静态链接,但是整体不一定是静态链接,只是我们这个库局部静态链接。

如果我们只提供动态库,却非要静态链接,那么连接器就会报错:

总结

制作静态库 ar  -rc  -o  文件名    一系列.o文件

制作动态库 gcc  -shared  -o  文件名    一系列.o文件

        使用静态库                 gcc main.c -I(大i) 头文件路径 -L库路径  -l(小l)库名 

或者(头文件在当前路径)     gcc main.c 路径/库

        使用动态库   执行可执行程序时,需要四种方法,或者直接gcc main.c 路径/库(.h 在  ./)

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

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

相关文章

jvm 内存泄露、内存溢出、栈溢出区别

JVM(Java虚拟机)是负责执行Java程序的运行环境。以下是对内存泄露、内存溢出和栈溢出这几个概念的解释: 内存泄露(Memory Leak): 内存泄露指的是程序中分配的内存空间在不再被使用时没有被释放的情况。这可…

【python】集合

前言 简洁整理,无废话 集合概念 含义:跟数学中的基本一样 形式:{1,a,(1,2)} 性质:不重复性,集合中每个元素不会有重复;集合中必须是不可变元素,不能有列表可以有元组 创建:{}或…

2核4g服务器可以带多少用户?

腾讯云轻量应用服务器2核4G5M配置性能测评,腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?并发数10,支持每天5000IP人数访问,腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线?并发数测试、CPU性能、内存性能、…

Unity2019.2.x 导出apk 安装到安卓Android12+及以上的系统版本 安装出现-108 安装包似乎无效的解决办法

Unity2019.2.x 导出apk 安装到安卓Android12及以上的系统版本 安装出现-108 安装包似乎无效的解决办法 导出AndroidStudio工程后 需要设置 build.gradle文件 // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAINbuildscript {repositor…

Vue3+TypeScript 学习回顾,温故而知新

文章简介: (1)简介: 在 Vue3 中编码规范如下: 编码语言: JavaScript代码风格: 组合式API选项式、API简写形式: setup语法糖 (2)复习内容: 1.核心: ref、reactive、computed、w…

亚马逊云科技Glue

Glue 最重要的部分, ETL:用于从 A 点(我们的源数据)提取、转换和加载数据到 B 点(目标文件或数据存储库)。 AWS Glue 会为您执行大量此类工作。 转换通常是更繁重的工作,需要从各种来源进行组合…

springboot整合swagger,postman,接口规范

一、postman介绍 1.1概述 工具下载 Postman(发送 http 请求的工具) 官网(下载速度比较慢):Download Postman | Get Started for Free 网盘下载:百度网盘 请输入提取码 1.2Http 请求格式 请求地址请求方法状…

算法刷题笔记

1.力扣-1337.矩阵中战斗力最弱的K行 给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。 请你返回矩阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。 如果第 i 行的军人数量少于第 j 行,或者两行…

C语言分析基础排序算法——归并排序

目录 归并排序 递归版本 非递归版本 非递归版本的问题 归并排序小优化 归并排序 归并排序,分为分治以及合并,分治部分可以使用递归或者非递归完成,归并排序的基本思路是:将已有序的子序列合并,得到完全有序的序列…

探索递归函数:C语言中的使用方法

递归函数是一种在程序设计中常见且强大的工具,它可以将一个问题分解成更小的子问题,并通过反复调用自身来解决这些子问题。在C语言中,递归函数的运用极大地增强了程序的灵活性和可读性。本文将探讨C语言中如何使用递归函数,以及递…

Python之Web开发中级教程----搭建Web框架二

Python之Web开发中级教程----搭建Web框架二 搭建虚拟环境 虚拟环境的作用 虚拟环境可以搭建独立的python运行环境, 使得单个项目的运行环境与其它项目互不影响. 搭建虚拟环境 (1)安装 sudo pip install virtualenv sudo pip install virtualenvwra…

JUC之AQS

AQS抽象的队列同步器 public abstract class AbstractQueuedSynchronizerextends AbstractOwnableSynchronizerimplements java.io.Serializable {AbstractQueuedSynchronizer 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现,是重量级基础框架及整个JUC体…

60 个深度学习教程:包含论文、实现和注释 | 开源日报 No.202

labmlai/annotated_deep_learning_paper_implementations Stars: 44.0k License: MIT annotated_deep_learning_paper_implementations 是一个包含深度学习论文的 60 个实现/教程,附带并排注释;包括 transformers(原始、xl、switch、feedbac…

区块链推广海外市场怎么做,CloudNEO服务商免费为您定制个性化营销方案

随着区块链技术的不断发展和应用场景的扩大,区块链项目希望能够进入海外市场并取得成功已成为越来越多公司的目标之一。然而,要在海外市场推广区块链项目,需要采取有效的营销策略和措施。作为您的区块链项目营销服务商,CloudNEO将…

超详细——VsCode连接远程主机/虚拟机并设置免密登录

超详细——VsCode连接远程主机/虚拟机并设置免密登录 文章目录 超详细——VsCode连接远程主机/虚拟机并设置免密登录[toc]连接到远程主机/虚拟机步骤1、打开vscode拓展 搜索 remote-ssh并安装步骤2、打开远程主机/虚拟机的ssh服务步骤3、设置连接远程主机的配置文件 设置免密登…

网络爬虫丨基于scrapy+mysql爬取博客信息

文章目录 写在前面实验描述实验框架实验需求 实验内容1.安装依赖库2.创建Scrapy项目3.配置系统设置4.配置管道文件5.连接数据库6.分析要爬取的内容7.编写爬虫文件 运行结果写在后面 写在前面 本期内容:基于scrapymysql爬取博客信息并保存到数据库中 实验需求 ana…

欧科云链做客Google Cloud与WhalerDAO专题论坛,畅谈Web3数据机遇

3月10日,由Google Cloud、WhalerDAO和baidao data主办,以Web3AI 2024 DATA POWER为主题的分享会在北京中关村举行。欧科云链高级研究员Jason Jiang受邀参加活动,带来“从链上数据发掘Web3时代的无限机遇”的主题分享。 Web3.0核心要素始终是链…

波奇学Linux:信号量环形队列,原生线程池,封装线程

基于信号量的多生产多消费环形队列 代码 const static int defaultcap5;template<class T> class RingQueue { private:void P(sem_t &sem){sem_wait(&sem); //资源-1}void V(sem_t &sem){sem_post(&sem); //资源加一}void Lock(pthread_mutex_t &…

c++实现简单搜索二叉树<K,V>形

文章目录 搜索二叉树节点类BSTreeNode(节点类的构造) BSTree(功能实现类)Insert(插入)Erase(删除)Find(查找这个节点) 搜索二叉树 搜索二叉树本质:左节点比我小 右节点比我大 节点类 BSTreeNode:给自身节点封装一个类 用这个类来添加节点的操作 我们写的是一个key.value型的搜…

【现代C++】移动语义和右值引用

现代C++中的移动语义和右值引用是C++11引入的重要特性,旨在优化资源管理和提升性能。这些特性允许资源的转移而非复制,特别是对于临时对象和大型对象。 1. 右值引用 右值引用是对临时对象的引用,它允许你修改临时对象。使用&&来声明右值引用。 #include <iost…