1. 什么是库

库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能 每个⼈的代码都从零开始,因此库的存在意义⾮同寻常。 本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:

• 静态库 .a[Linux]、.lib[windows]

• 动态库 .so[Linux]、.dll[windows]

2. 静态库

在当前目录下,有以上两个我们写的.h文件和对应的.c文件。在test文件当中包含了我们使用的头文件,如果我们希望test文件编译链接形成可执行文件,直接gcc的话则会报错!

我们先把所有的.c文件编译形成.o文件,然后再链接所有的.o文件就可以形成可执行文件了。 

所以我们可以得出结论结论:所有的库【动态库、静态库】其本质都是源文件对应的.o文件!

不过,我们写的库终究还是要给别人使用,如果我们每次都是把许多.o文件给别人,让别人链接这么多的.o文件,那这也太麻烦了,所以在Linux中,我们有一个转门针对这个问题的打包命令ar【archive 、r 是 gnu 归档⼯具, rc 表⽰ (replace and create) 静态库的本质就是.o打了一个包。

假设在张三目录下,我们需要用到我们设计的库,那我们可以我们的库打包拷贝给他,并同时把我们的头文件拷贝给他,这样张三就可以更方便的使用了。

需要解释一下指令gcc -o test test.c -L . -l myc中的选项,-L表示在哪个路径下找库【编译器默认在路径/usr/lib64查找库】,-l表示我们要找的库的名字。对于库名libmyc.a来说前缀lib和后缀.a是固定的,myc表示真实有效的命名。如果我们要连接所有的非C/C++标准库【包括外部或我们自己写的】,都需要指明-L和-l。不过,如果我们将这些库提前安装【也就是拷贝】到系统当中,其实我们也不需要指明路径了。其实,还有一个-I选项来指明我们需要的头文件,只不过这里默认在当前路径下找就不需要特殊指明了。

3. 动态库

下面简单制作了一个Makefile文件方便动态库的生成打包和垃圾文件的清理。

可以看到,在操作方面和静态库相比,不同的地方在于,我们都是使用gcc编译器,形成.o文件时,我们需要增加一个选项-fPIC,在打包文件时,我们需要增加一个选项-shared【动态库也叫共享库】。 

• shared:表⽰⽣成共享库格式

• fPIC:产⽣位置⽆关码(position independent code),这里先不解释。

• 库名规则:libxxx.so

下面我已经把打包好的动态库和头文件拷贝给张三目录下,我们编译链接动态库可以成功生成可执行文件test,但是在执行该文件时却发生了问题:找不到动态库!

 test所依赖的libmyc.so库果然没有找到。

解释:当我们在编译形成可执行文件时,我们只告诉了编译器gcc我们的动态库在哪里,叫什么,而并没有让系统知道我们的动态库在哪里叫什么!而可执行文件在运行时,需要知道动态库的路径和名字。

那这里就有一个问题了:为什么静态库在编译链接形成可执行后,就可以直接运行了,没有找不到库的问题??? 

那是因为,静态库在编译链接时就把静态库文件拷贝到了可执行文件当中,当我们运行时就不再依赖库了,程序直接加载到内存当中就可以运行。而动态库在形成程序加载到内存当中运行时,依然需要找到对应的动态库!

解决办法:

>系统会默认在指定路径下【一般来说在这个路径/lib64/】寻找对应的库文件,所以最简单粗暴的方法就是把我们的动态库拷贝到对应的路径【系统安装动态库】下。

>第二种方法就是给我们的库在系统路径下建立软链接,让软链接执向我们的库。

>第三种做法就是导环境变量的方法:系统不仅会在默认的路径下寻找动态库,还会根据环境变量中的LD_LIBRARY_PATH路径下寻找动态库,所以我们可以把我们库的路径导入到这个环境变量中。

>第四种做法就是修改相关的配置文件,先看操作:

我们将动态库所在的路径拷贝到文件/etc/ld.so.conf.d/mylib.conf中,其中,文件mylib.conf是我们自己随便新建的。

接下来,我们完成这个命令即可:【要⽣效,这里要执行ldconfig,重新加载库搜索路径】

4. 一些小问题

上面,我们初步了解了我们什么是动静态库以及它们的生成和使用的相关操作,下面有一些小问题。

>如果我们为程序同时提供动静态库,编译器会怎么做呢?

答:gcc/g++编译器会默认使用动态库!

>那如果,我们非要使用静态库链接,如何办到呢?

答:在编译时带上-static选项!不过,如果没有静态库,编译时则会报错!

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

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

相关文章

Hadoop集群启动 (ZooKeeper、HDFS、YARN、Hbase)

一、启动ZooKeeper集群 sh /opt/modules/zookeeper-3.4.14/bin/zkServer.sh start[hadoopcentos01 ~]$ sh /opt/modules/zookeeper-3.4.14/bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/modules/zookeeper-3.4.14/bin/../conf/zoo.cfg Startin…

React Hooks全面解析:从基础到高级的实用指南

React Hooks全面解析:从基础到高级的实用指南 React Hooks自2018年16.8版本引入以来,彻底改变了React组件的开发方式。** Hooks使函数组件获得了与类组件同等的表达能力,同时简化了代码结构,提升了可维护性**。本文将系统介绍Rea…

LINUX75 LAMP

LAMP 环境 yum NetworkManager systemctl status firewalld setenforce 0 Last login: Fri Jul 4 19:21:47 2025 from 192.168.235.1 [rootweb ~]# cd /usr/local/apache2/conf/ [rootweb conf]# ls extra httpd.conf httpd.conf.bak magic mime.types original [root…

cloudflare配合github搭建免费开源影视LibreTV一个独享视频网站 详细教程

一、项目简介 LibreTV 是一个开源的 IPTV/影视聚合前端项目,支持 M3U 播放列表、EPG 电子节目单等。它本身是纯前端项目,非常适合用 GitHub Pages Cloudflare 免费托管。 二、准备工作 GitHub 账号 注册并登录 GitHub Cloudflare 账号 注册并登录 …

Linux/Unix进程概念及基本操作(PID、内存布局、虚拟内存、环境变量、fork、exit、wait、exec、system)

进程 文章目录 进程I 进程基本概念1、进程和程序2、进程号和父进程号3、进程内存布局4、虚拟内存管理(1)程序的两种局部性(2)虚拟内存的规划(3)虚拟内存的优点 5、栈和栈帧6、命令行参数argc和argv7、环境变…

0基础学Python系列【25】 单元测试入门教程

大家好,欢迎来到Python学习的第三站!🎉 这部分会涉及一些Python的进阶技术,虽然不一定是必需的,但学会这些,你会觉得编程更得心应手。 本章要学什么? Python调试器(pdb)装饰器lambda函数代码性能分析单元测试入门 —— 今天讲这里听起来有点多?别担心,我们慢慢来,…

iOS常见内存错误码

一、经典十六进制错误码0xDEADBEEF(EXC_BAD_ACCESS) 含义:野指针访问(访问已释放的内存地址)。 记忆点:“DEAD BEEF” 可理解为 “死亡牛肉”,象征指针指向的内存已 “死亡”。 触发场景&#x…

CSS01:CSS的快速入门及优势

CSS快速入门 style 练习格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS</title><!-- 规范,<style>可以编写css代码,每一个声明最好用分号结尾语法&#xff1a;…

springsecurity5配置之后启动项目报错:authenticationManager cannot be null

目录 配置代码 报错信息 解决办法 配置代码 下面的配置为响应式的配置方式 //这个配置只是配置springboot admin的一个例子,具体的配置可能比较复杂 @EnableWebFluxSecurity public class SecurityConfig {private final AdminServerProperties adminServer;public Securi…

攻防世界-Rerverse-game

知识点 1.ida逆向 2.函数分析逆向 步骤 用Exeinfo打开&#xff0c;为32位exe文件。 方法一&#xff1a; 玩游戏通关&#xff0c;根据游戏规则&#xff0c;m1&#xff0c;n依次为1到8即可得到flag。 方法二&#xff1a; 用32位IDA打开 ctrlF搜索main&#xff0c;点击_main,…

openEuler 24.03 全流程实战:用 Ansible 5 分钟部署分布式 MinIO 高可用集群

目录 0 | 为什么要写这篇教程&#xff1f; 1 | 准备工作 1.1 控制节点手工下载 MinIO 1.2 SSH 互信&#xff08;可跳过&#xff0c;本教程已有互信&#xff09; 1.3 安装 Ansible & SELinux 依赖 2 | 项目目录 3 | Inventory hosts.ini 4 | 变量文件 group_vars/al…

最左匹配原则

导读&#xff1a; 首先创建一张 test 表&#xff0c;并插入一些数据&#xff1a; CREATE TABLE test ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键, a int(11) NOT NULL, b int(11) NOT NULL, c int(11) NOT NULL, d int(11) NOT NULL, PRIMARY KEY (id), KEY idx_abc …

MySQL 8.0 OCP 1Z0-908 题目解析(17)

题目65 Choose two. Which two are characteristics of snapshot-based backups? □ A) The frozen file system can be cloned to another virtual machine immediately into active service. □ B) There is no need for InnoDB tables to perform its own recovery when re…

Level2_12小球与挡板(移动+反弹)

一、前引 #已经学习完了: #1.数据结构&#xff1a;集合、元组、字典 #2.函数 #3.类和对象 #4.继承与多态 #1.规划编程项目: #&#xff08;1&#xff09;你想做什么什么样功能的项目&#xff1f; # 接小球游戏,碰到挡板时自动反弹 #&#xff08;2&#xff09;功能有哪些&#x…

win11 2025开机禁用微软账号登录,改本地用户登录,品牌预装机福音

今天开箱了品牌商出厂系统一台华为笔记本&#xff0c;开机提示连接wifi并需要登录微软账号&#xff0c;其中过程实在缓慢&#xff0c;而且老是提示自动更新&#xff0c;速度太慢了&#xff0c;等的花都谢了&#xff0c;进到桌面大概得要30-40分钟&#xff0c;还不如本地用户登录…

【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(三)

ELF文件格式内部结构详解(三) 文章目录 ELF文件格式内部结构详解(三)12、动态部分和动态加载13、依赖加载(需要)14、程序重定位14.1 静态重定位14.2 动态重定位14.3 全局偏移表 (GOT)14.4 过程链接表 (PLT)12、动态部分和动态加载 ELF 文件格式中的 .dynamic 部分用于指…

HTML知识复习2

文章目录 HTML5简介什么是HTML5HTML5优势 新增语义化标签新增布局标签新增状态标签新增列表标签新增文本标签 新增表单功能表单控件新增属性input新增属性值 新增多媒体标签视频标签音频标签 HTML5兼容性处理 HTML5简介 什么是HTML5 HTML5 是新一代的 HTML 标准&#xff0c;2…

栈(Stack)和队列(Queue)

文章目录 前言1. 栈(Stack)1.1 什么是栈1.2 栈的常用操作1.3 栈的模拟实现1.4 栈的应用场景1.4.1 元素序列处理1.4.2 字符串反转1.4.3 括号匹配1.4.4 逆波兰表达式求值1.4.5 栈的压入、弹出序列1.4.6 最小栈1.4.7 递归转循环 1.5 概念区分1.5.1 数据结构中的栈1.5.2 JVM中的虚拟…

5G MEC四大核心挑战技术解析报告

一、MEC园区部署挑战:数据本地化与低时延接入 痛点深度解析 数据不出园区:工业质检、医疗影像等敏感业务需数据在本地闭环处理。但运营商基站与企业MEC间若经公网绕行,时延超50ms且存在泄露风险。L2网络局限:传统L2接入网无法实现基站→UPF的智能路由,导致业务流绕行城域…

【硬核拆解】英伟达Blackwell芯片架构如何重构AI算力边界?

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 一、Blackwell诞生的算力危机&#xff08;2025现状&#xff09; graph TD A[2025年AI算力需求] --> B[千亿参数模型训练能耗…