当前位置: 首页 > news >正文

Linux C语言 34-库封装操作

Linux C语言 34-库封装操作

本节关键字:C语言 封装库 动态库
相关C库函数:

什么是库?

库是现成的,可以复用的代码。从本质上看,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。在C语言的编程中,把某些功能性的函数放在一个链接库里再提供给其他人使用的过程叫做制作库(封装库)。C语言中有两种库:

  • 动态库(.a、.lib)
  • 静态库(.so、.dll)

静态库

在链接阶段将汇编生成的目标文件.o与引用的库一起链接打包到可执行文件中,该过程的链接方式称为静态链接,生成的库称为静态库。
静态库的特点:

  • 静态库对函数库的链接是在编译时期完成的
  • 程序在运行时与函数库无联系,移植方便
  • 占用更多的内存空间,因为所有相关的目标文件和库文件都被链接合成一个可执行文件
  • 更新麻烦,每次更新都需要全量更新

静态库的生成与调用

Linux系统中静态库的命名规范必须是“lib[name].a”:lib前缀,中间是静态库名称,扩展名为.a

静态库的创建

$ gcc -c test.c
$ ar -crv libtest.a test.o

静态库的使用

(1)包含头文件
(2)调用静态库中的函数
(3)编译时加上指定静态库:gcc testlib.c -L. -ltest

动态库

动态库是一种不可执行的二进制文件,它允许程序共享执行特殊任务。与静态库不同的是,动态库是程序在执行时才进行加载。

动态库的作用

  • 代码复用
  • 动态库对函数的链接是在运行时完成的
  • 节约内存,不同进程调用相同的库,可实现进程之间的资源共享(因此动态库也被称为共享库)
  • 更新时只需更新相关的动态库(增量更新)

动态库的生成与调用

Linux系统中动态库的命名规范必须是“lib[name].so”:lib前缀,中间是静态库名称,扩展名为.so

动态库的创建

$ gcc -shared -fPIC test.c -o libtest.so

-shared 是生成动态库
-fPIC 生成位置无关代码,默认添加

动态库的使用

(1)包含头文件
(2)调用动态库中的函数
(3)编译时加上指定动态库:gcc testlib.c -L. -ltest

动态库找不到的问题解决

(1)将.so文件拷贝到 /usr/lib 目录下
(2)更新环境变量:export LD_LIBRARY_PATH=[动态库所在的绝对路径]
(3)将动态库所在的绝对路径添加到 /etc/ld.so.conf 文件里;然后重新加载配置文件 /sbin/ldconfig

gcc相关编译选项

  • -shared 生成动态链接库
  • -static 生成静态链接库
  • -fIPC 编译为位置独立的代码,用于编译动态库(共享库)。目标文件需要创建成位置无关代码,在程序装载动态库的时候,动态库可以放在程序内存的任何地方
  • -L 要链接的库所在的目录
  • -l 指定链接时需要的动态库。编译器查找动态库时有隐含的命名规则,即“lib[name].so”或“lib[name].a”
  • -Wall 生成所有警告信息
  • -ggdb 将尽可能生成gdb可以使用的调试信息
  • -g 编译器在编译的时候产生调试信息
  • -c 只激活预处理、编译和汇编,也就是将程序做成目标文件(.o文件)
  • -Wl,options 把参数(options)传递给链接器ld,如果options中间有都逗号,就将options分成多个选项,然后传递给链接程序

库查看命令

查看可执行程序依赖的动态库

例如:查看可执行程序 mytest 的依赖动态库
$ ldd mytest

查看库中的函数列表

例如:查看 test.so 中的函数有哪些
$ nm test.so

相关文章:

Linux C语言 34-库封装操作

Linux C语言 34-库封装操作 本节关键字:C语言 封装库 动态库 相关C库函数: 什么是库? 库是现成的,可以复用的代码。从本质上看,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。在C语言的编…...

JavaWeb-Tomcat

1. Web服务器 web服务器由硬件和软件组成: 硬件:计算机系统软件:计算机上安装的服务器软件,安装后可以为web应用提供网络服务。 常见的JavaWeb服务器: Tomcat(Apache):应用最广泛的…...

k8s之Pod常用命令详解、镜像拉取策略(imagePullPolicy)

常用命令 kubectl api-resources #查询可操作的资源对象列表kubectl get pod #查看默认命名空间下所有pod kubectl describe pod podname #获取默认命名空间下POD详情# 如果要查看制定命名空间则使用 -n nsname kubectl get pod -n ns kubectl describe pod podname -n ns# 以Y…...

Spark低版本适配Celeborn

Spark-3.5版本以下使用Celeborn时,无法使用动态资源,对于低版本的Spark,Celeborn提供了patch。各版本patch如下 https://github.com/apache/incubator-celeborn/tree/main/assets/spark-patch 下载patch,这里下载spark-3版本&am…...

idea报错:Error:java: 不允许在使用 -release 时从系统模块 java.xml 导出程序包?

File->Settings, 把红框编译选中选项全部删除掉...

Vector Quantized Diffusion Model for Text-to-Image Synthesis

Vector Quantized Diffusion Model for Text-to-Image Synthesis Shuyang Gu, University of Science and Technology of China, Microsoft, CVPR2022, Cited: 340, Code, Paper 1. 前言 我们提出了用于文本到图像生成的矢量量化扩散(Vector Quantized Diffusion Model&…...

solidity实现ERC1155多代币标准

文章目录 1、NFT - 维基百科2、IERC1155MetadataURI3、IERC1155Receiver4、IERC11555、ERC11556、NFT11557、开源地址 1、NFT - 维基百科 ERC-1155 标准于2018年6月由Witek Radomski、Andrew Cooke、Philippe Castonguay、James Therien、Eric Binet及Ronan Sandford提出。此标…...

10、外观模式(Facade Pattern,不常用)

外观模式(Facade Pattern)也叫作门面模式,通过一个门面(Facade)向客户端提供一个访问系统的统一接口,客户端无须关心和知晓系统内部各子模块(系统)之间的复杂关系,其主要…...

<软考>软件设计师-3程序设计语言基础(总结)

(一) 程序设计语言概述 1 程序设计语言的基本概念 1-1 程序设计语言的目的 程序设计语言是为了书写计算机程序而人为设计的符号语言,用于对计算过程进行描述、组织和推导。 1-2 程序语言分类 低级语言 : 机器语言(计算机硬件只能识别0和1的指令序列)&…...

C/C++---------------LeetCode第278. 第一个错误的版本

第一个错误的版本 题目及要求二分查找 题目及要求 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你…...

C语言三种循环输出9*9乘法表

解题思路&#xff1a; 1、外层循环控制1~9循环 2、内层控制循环的次数 比如&#xff1a; 1 * 1 1 循环一次 1 * 1 1 1 * 2 循环两次 依此类推 int i, j;printf("for 打印9*9乘法表\r\n");for(i 1; i <10; i) {for(j 1; j < i;j) {printf("%d * %d %d…...

IntelliJ IDEA 之初体验

文章目录 第一步&#xff1a;下载与安装 IntelliJ IDEA1&#xff09;官网下载2&#xff09;选择那种安装包3&#xff09;开始下载4&#xff09;解压 第二步&#xff1a;启动 IntelliJ IDEA第三步&#xff1a;创建第一个 Java 项目第四步&#xff1a;运行第一个 Java 程序1&…...

java中synchronized和Lock的区别是什么?

synchronized 和 Lock 都是 Java 中用于实现线程同步的机制&#xff0c;但它们在使用方式和功能上存在一些区别。 使用方式 synchronized&#xff1a; 是 Java 语言关键字&#xff0c;可用于方法或代码块。通过 synchronized 关键字实现的同步是隐式的&#xff0c;无需手动释…...

ESP32-Web-Server编程-通过 Base64 编码在网页中插入图片

ESP32-Web-Server编程-通过 Base64 编码在网页中插入图片 概述 不同于上节 ESP32-Web-Server编程-在网页中通过 src 直接插入图片&#xff0c;本节引入 Base64 编码来显示图片。 Base64 是一种用64个字符来编码表示任意二进制数据的方法。任何符号都可以转换成 Base64 字符集…...

聊一聊大模型 | 京东云技术团队

事情还得从ChatGPT说起。 2022年12月OpenAI发布了自然语言生成模型ChatGPT&#xff0c;一个可以基于用户输入文本自动生成回答的人工智能体。它有着赶超人类的自然对话程度以及逆天的学识。一时间引爆了整个人工智能界&#xff0c;各大巨头也纷纷跟进发布了自家的大模型&#…...

pandas空格及网页空格符NBSP替换处理

df3[动作一课程内容]df3[动作一课程内容].str.replace( ,) df3[动作一课程内容]df3[动作一课程内容].str.replace( ,) 截图中代码为python展示代码&#xff0c;由于网页空格符和常规空格符看起来大致相同&#xff0c;但却不能用常规空格替换解决...

智能优化算法应用:基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.战争策略算法4.实验参数设定5.算法结果6.参考…...

数据结构和算法-栈

数据结构和算法-栈 1. 栈的介绍 栈的介绍&#xff1a; 栈的英文为(stack)栈是一个先入后出的有序列表栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端&#xff0c;为变化的一端&#xff0c;称为栈顶&#xff0c;另一端为固…...

C#基础与进阶扩展合集-进阶篇(持续更新)

目录 本文分两篇&#xff0c;基础篇点击&#xff1a;C#基础与进阶扩展合集-基础篇 一、进阶 1、Predicate 2、设置C#语言版本 3、ListCollectionView过滤集合 4、值类型与引用类型 5、程序设置当前项目工作目录 6、获取App.config配置文件中的值 7、Linq常用语句 8、…...

快速入门GitHub 之超简单的注册方法和超好用的使用技巧

最近几天发现有些人对Github网站很好奇,但是无奈自己不会用,因为是外国人的网站,首先自己的英文就不过关。对于这个,其实可以用谷歌浏览器去浏览Github,它有一键翻译的功能。但还是有必要介绍一下关于Github的一些功能和具体操作,初学编程语言的小伙伴们一定对 GitHub 有…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...

JavaScript性能优化实战大纲

性能优化的核心目标 降低页面加载时间&#xff0c;减少内存占用&#xff0c;提高代码执行效率&#xff0c;确保流畅的用户体验。 代码层面的优化 减少全局变量使用&#xff0c;避免内存泄漏 // 不好的实践 var globalVar I am global;// 好的实践 (function() {var localV…...