库(Library)

news2024/11/13 15:53:47

库的定义

在Linux操作系统中,库(Library)是一段编译好的、可重用的代码,它能够被其他程序或应用程序在运行时调用。库可以提高代码的模块化,使得开发者可以共享和重用代码,从而提高开发效率,减少冗余。

库:把一些常用的函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用。本质上来说库是一种可执行代码的二进制形式文件。

由于windows和linux的本质不同,因此库的二进制是不兼容的。(Linux中的C运行库是glibc, 由GUN发布)

在Linux的平台下,静态库文件的后缀是 .a ,动态库的后缀是 .so 。
在window的平台下,静态库文件的后缀是 .lib ,动态库的后缀是.dll

库的分类

静态库(Static Libraries)

静态库在程序编译时会被复制到目标代码中, 以.a结尾。

优点:程序运行时将不再需要该静态库,运行时无需加载库,运行速度更快,可移植性好。

缺点:静态库中的代码复制到了程序中,因此体积较大;静态库升级后,程序需要重新编译链接。

静态库的制作

1、将源文件编译生成目标文件

gcc -c .c文件 -o .o文件

2、创建静态库用ar命令,将多个.o生成.a

ar crs lib.a文件 .o文件

注意:静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a

3、测试使用静态库

gcc main.c -L . -l fun

注意:-L指定静态库的路径,-l指定库名

执行:./a.out

动态库(Shared Libraries)

动态库是在程序运行时才被载入代码中,也叫共享库,以.so结尾。

优点:程序在执行时加载动态库,代码体积小;程序升级更简单;不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

缺点:运行速度慢,运行时还需要动态库的存在,移植性较差。

动态库的制作

1、用gcc来创建共享库

gcc -fpic -c fun.c -o fun.o//-fpic创建与地址无关的编译程序

gcc -shared fun.o -o libmyfun.so//生成动态库

2、测试使用动态库

sudo cp libmyfun.so /lib

gcc main.c -l myfun

./a.out : 可以正常编译通过,但是运行报错

./a.out: error while loading shared libraries: libmyfun.so: cannot open shared object file: No such file or directory

原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件,所以不用-L加路径了,直接gcc main.c -lmyfun就可以了

解决方法(有三种):

1) 把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径)

2) 在LD_LIBRARY_PATH环境变量中加上库所在路径。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:(终端关闭,环境变量就没在了)

3) 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新

sudo vi xx.conf

Makefile创建库文件

Make工具教程

https://www.jb51.net/article/281278.htm

LIB_NAME?= test                                                                                  
STATIC_NAME ?= lib$(LIB_NAME).a
SHARE_NAME  ?= lib$(LIB_NAME).so
//?=表示如果该变量没有赋值,则进行赋值操作

all: static_library shared_library
 
static_library: 
    gcc -c *.c;
    ar  -cr $(STATIC_NAME) *.o;
 
shared_library:
    gcc -shared -fpic -o $(SHARE_NAME) *.c;
 
clean:
    rm -rf *.o
    rm -rf *.a *.so

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

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

相关文章

如何在 Ubuntu 24.04 上安装 MariaDB ?

MariaDB 是一个流行的开源关系数据库管理系统,它是 MySQL 的一个分支,它被广泛用于存储和管理数据。本指南将引导您完成在 Ubuntu 24.04 上安装 MariaDB 的步骤。 Step 1: Update Your System 首先更新系统,确保所有的软件都是最新的。 su…

PMP–一、二、三模、冲刺、必刷–分类–14.敏捷–技巧–刺探

文章目录 技巧一模反例不选“刺探”14.敏捷--流程:(2)每日站会(15分钟、轮流开、提出问题、不解决问题):输入任务板/看板 → 输出任务板更新、燃尽图更新、障碍日志、产品增量;14.敏捷--方法--每…

树莓派扩展RGB点阵屏的使用

本篇来介绍一个树莓派的RGB 8x8点阵屏扩展板的使用。 1 RGB点阵屏 这里使用SunFounder的一个RGB 8x8树莓派扩展板,将其插接到树莓派中即可使用。 2 树莓派IIC配置 树莓派系统的安装,可参考之前的文章: 这个RGB点阵屏与树莓派直接使用IIC通…

Opencv中的直方图(2)计算图像的直方图函数calcHist()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算一组数组的直方图。 函数 cv::calcHist 计算一个或多个数组的直方图。用于递增直方图bin的元组的元素是从相同位置的相应输入数组中获取的。…

C++设计模式——Template Method模板方法模式

一,模板方法模式的定义 模板方法模式是一种行为型设计模式,它先定义了一个算法的大致框架,然后将算法的具体实现步骤分解到多个子类中。 模板方法模式为算法设计了一个抽象的模板,算法的具体代码细节由子类来实现,从…

Spring Boot中如何禁用Actuator端点安全性?

Spring Boot中如何禁用Actuator端点安全性? 1、为什么考虑禁用?2、如何禁用?方法一:自定义Security配置(推荐)方法二:绕过安全性(不推荐) 3、注意事项4、总结 &#x1f4…

Golang | Leetcode Golang题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; const mask1, mask2 1 << 7, 1<<7 | 1<<6func getBytes(num int) int {if num&mask1 0 {return 1}n : 0for mask : mask1; num&mask ! 0; mask >> 1 {nif n > 4 {return -1}}if n > 2 {return n}r…

AI机械键盘,罗技推出首款AI机械键盘K98M

在这个智能化日益普及的时代&#xff0c;我们的生活中充斥着各种智能设备。 从智能手机到智能家居&#xff0c;现在连键盘也加入了智能化的行列。罗技&#xff0c;作为知名的电脑配件制造商&#xff0c;最近推出了他们的首款AI机械键盘K98M。这款键盘集成了百度文心一言提供的…

C++设计模式——Observer观察者模式

一&#xff0c;观察者模式的定义 观察者模式是一种行为型设计模式&#xff0c;又被称为"发布-订阅"模式&#xff0c;它定义了对象之间的一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会收到通知并自动更新。 观察者模式…

13、Django Admin创建两个独立的管理站点

admin文件 from .models import Epic, Event, EventHero, EventVillain from django.contrib.admin import AdminSiteclass EventAdminSite(AdminSite):site_header "Events管理"site_title "欢迎您&#xff01;"index_title "管理员"even…

AI自动生成PPT哪个软件好?如何自动生成专业级PPT?

新学期伊始&#xff0c;准备开学演讲稿的你是否还在为制作PPT而烦恼&#xff1f;别担心&#xff0c;现在有了AI的帮助&#xff0c;生成专业且吸引人的PPT变得轻而易举。 本文将为你揭秘4种高效的AI自动生成PPT的方法&#xff0c;让你在新学期的演讲中脱颖而出。无论是简洁明了…

畅游5G高速网络:联发科集成Wi-Fi6E与蓝牙5.2的系统级单芯片MT7922

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) IPBrain平台君 集成电路大数据平台 2024年09月03日 17:28 北京 联发科一直以创新技术追赶市场需求…… “不努力向前游就会被海浪拍回岸边…” 芯片设计公司产品层出不穷,想要站…

Redis集群搭建以及用idea连接集群

一、redis的集群搭建&#xff1a; 判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数&#xff0c;搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。…

Datawhle X 李宏毅苹果书AI夏令营深度学习笔记之——卷积神经网络

卷积神经网络简介 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习模型&#xff0c;尤其擅长处理图像和视频等高维度的数据。CNN 通过模仿人类视觉系统的工作方式&#xff0c;自动学习数据中的空间层次结构&#xff0c;使得它在计算机视…

我找到了一个让ChatGPT稳定通过草莓测试的方法,百试百灵!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

windows C++ 并行编程-并发和UWP(三)

控制执行线程 Windows 运行时使用 COM 线程模型。 在此模型中&#xff0c;根据对象处理其同步的方式&#xff0c;对象被托管在不同的单元中。 线程安全对象托管在多线程单元 (MTA) 中。 必须通过单个线程访问的对象托管在单线程单元 (STA) 中。 在具有 UI 的应用程序中&#…

系统找不到指定的文件怎么解决?

把U盘插在电脑上&#xff0c;当我打开U盘中的文件时&#xff0c;弹窗提示系统找不到指定的文件&#xff0c;这是什么情况&#xff1f;有谁遇到过吗&#xff1f;大家有没有解决办法&#xff1f; 这个问题可能大家并不陌生&#xff0c;可能也曾遇到过&#xff0c;造成问题出现的原…

DriveLM的baseline复现

DriveLM是一篇很有意思的工作&#xff0c;把自动驾驶跟MLLM结合到一起了&#xff0c;实现端到端的感知or决策规划。 Repo&#xff1a;https://github.com/OpenDriveLab/DriveLM 该工作是基于nuScenes数据集做的&#xff0c;官方paper里给出了数据的具体构建方式&#xff0c;感…

云计算之ECS

目录 一、ECS云服务器 1.1 ECS的构成 1.2 ECS的实例规格 1.3 镜像 1.4 磁盘 1.5 安全组 1.6 网络 1.7 产品结构 二、块存储介绍 2.1 快存储定义 2.2 块存储性能指标 2.3 快存储常用操作-云盘扩容 2.4 块存储常见问题 三、快照介绍 3.1 快照定义 3.2 快照常见问题…

《python语言程序设计》第8章第12题生物信息:找出基因,生物学家使用字母A C T和G构成字符2串建模一个基因组(下)

一、上一个版本 抱歉各位兄弟我感觉这道题我现在的能力有限,不纠结了跳过去.等第3刷的时候解决吧. 可能彼岸就在眼前,但是我累了.等下次吧 这个版本中div_text函数已经可以很好的划分字符串了 但是我发现了一个问题.它间隔字符效果如下 genome_text TTATGTTTTAAGGATGGGGCGTTAG…