Linux - 动静态库

文章目录

    • 一、静态库
      • 1、定义
      • 2、文件扩展名
      • 3、生成静态库
      • 4、使用静态库
      • 5、静态库的优缺点
    • 二、动态库
      • 1、定义
      • 2、文件扩展名
      • 3、生成动态库
      • 4、使用动态库
      • 5、动态库的优缺点
      • 6、简单动态库加载
    • 三、补充


一、静态库

1、定义

静态库是在编译时链接到最终的可执行文件中的库。这意味着,在程序编译时,静态库中的代码会被复制到最终的可执行文件中。

2、文件扩展名

在Linux下静态库通常以 .a 作为文件扩展名(archive file)。

3、生成静态库

(1)ar指令
功能

用于创建、修改和提取归档文件(archive files),这些归档文件通常被称为静态库(static library)。

语法

ar [参数选项] [归档文件名] [目标文件列表]

常用选项

c:创建归档文件。
r:向归档文件中添加目标文件。如果目标文件已经存在于归档文件中,则替换它。
d:从归档文件中删除目标文件。
t:列出归档文件中包含的目标文件列表。
x:从归档文件中提取目标文件。

(2)生成静态库
mystring.h

  1 #pragma once                                                                                                                     2                                                                                 3 int my_strlen(const char * ptr); 

mystring.c

  1 #include"mystring.h"                                                                                                             2                                                                                 3 int  my_strlen(const char * ptr)                                                4 {                                                                               5     int count = 0;                                                              6     while(*ptr)                                                                 7     {                                                                           8         count++;                                                                9         ++ptr;                                                                  10     }                                                                           11                                                                                 12     return count;                                                               13 }

生成mystring.o

gcc -c mystring.c  -o mystring.o

使用mystring.o 生成静态库

ar -rc libmystring.a mystring.o //命名lib***.a

4、使用静态库

假设main.c源文件使用上述的库。

  1 #include"mystdio.h"                                                                                                              2 #include"mystring.h"                                                            3 #include<string.h>                                                              4 #include<stdio.h>                                                               5 int main()                                                                      6 {                                                                               7     const char * s = "hehe";                                                    8     printf("%d\n",my_strlen(s));                                                9     return 0;                                                                   10 }

(1)安装到系统路径下
将库拷贝到系统路径下

sudo cp libmystring.a /usr/lib

将头文件拷贝到系统路径下

udo cp mystring.h /usr/include

生成可执行文件
-l 选项:指定库名(去掉lib和后缀)
如果不指定库名,即便有路径也找不到库。

gcc main.c -o main -lmystring

运行生成的可执行文件
在这里插入图片描述
(2)和源文件一起
-L选项:指定库的路径。

生成可执行文件

gcc main.c -o main -L. -lmystring

运行生成的可执行文件
在这里插入图片描述
(3)使用带路径的库
在这里插入图片描述

-I选项:指定头文件的目录。

生成可执行文件

gcc main.c -o main -I./stdc/inclde -L./stdc/lib -lmystring

执行生成可执行文件
在这里插入图片描述

5、静态库的优缺点

优点:

  1. 无需额外的库文件:因为代码已经被复制到可执行文件中,所以运行时不需要额外的库文件。
  2. 部署简单:只需分发最终的可执行文件。

缺点:

  1. 增大可执行文件大小:因为每个使用静态库的程序都会包含库的副本。
  2. 浪费内存:如果多个程序使用同一个静态库,每个程序都会占用相同的代码空间。
  3. 当库文件修改时,使用当前静态库的程序可能需要重新编译。

二、动态库

1、定义

动态库(也叫共享库)是在程序运行时被链接到可执行文件中的库。这意味着,在程序运行时,动态库中的代码会被加载到内存中,并且可以被多个程序共享。

2、文件扩展名

在Linux下动态库通常以 .so(Shared Object)作为文件扩展名。

3、生成动态库

生成.o文件

gcc -c -fPIC mystring.c -o mystring.o

-fPIC 选项的作用是指示编译器生成与位置无关的代码(Position Independent Code)。这种代码可以在内存中的任何位置运行,而不需要重新定位。这对于共享库(动态库)来说是非常重要的,因为共享库在加载到进程地址空间时,其加载地址通常不是固定的,而是由操作系统动态决定的。。

生成动态库

gcc -shared -o libmystring.so mystring.o //通常以lib作为前缀

-shared 选项告诉编译器生成共享库。

4、使用动态库

(1)安装到系统路径下
将库拷贝到系统路径下

sudo cp libmystring.so  /usr/lib

将头文件拷贝到系统路径下

sudo cp mystring.h  /usr/include

生成可执行文件

gcc main.c -o main  -lmystring

运行生成可执行文件
在这里插入图片描述
(2)和源文件一起或者指定路径下
生成可执行文件
如:使用指定路径:

gcc main.c -o main  -I./stdc/include -L./stdc/lib  -lmystring

执行生成可执行文件
执行失败了,原因如下:
在这里插入图片描述
找不到动态库。
为什么编译成功了,还会报这种错误呢?
因为在编译时,指定的路径是给编译器看的,所以在编译时能找到库不会出错,而在执行时,系统链接库时会在系统默认路径下找(如/usr/lib),在库中找不到所以在执行时就会报错。

如何证明?
命令 ldd [可执行文件] ,可以看到可执行文件依赖的库
在这里插入图片描述
怎么解决?
使用软链接,让库和系统默认路径建立软连接。

sudo ln -s /home/xzy/112/dir3/stdc/lib/libmystring.so  /usr/lib/libmystring.so

在这里插入图片描述
再次运行可执行文件
在这里插入图片描述
(3)、修改环境变量
在环境变量LD_LIBRARY_PATH中加上库的路径,如果没有就创建。

添加环境变量

export LD_LIBRARY_PATH=/home/xzy/112/dir3/stdc/lib

在这里插入图片描述

5、动态库的优缺点

优点

  1. 节省磁盘和内存空间:因为多个程序可以共享同一个动态库。
  2. 便于更新和维护:只需更新动态库文件,而无需重新编译使用它的程序。
  3. 支持模块化:可以动态加载和卸载库,实现更灵活的程序设计。

缺点

  1. 部署复杂:需要确保动态库文件在运行时可用,可能需要额外的配置。
  2. 兼容性问题:不同版本的动态库可能不兼容,需要确保程序与库的版本匹配。

6、简单动态库加载

在这里插入图片描述

三、补充

(1)gcc/g++默认使用动态链接。
(2)如果同时提供动态库和静态库,那么默认使用动态库,如果想强制使用需要在编译指令后面加上-static选项。
(3)如果只提供静态库,不提供动态库,gcc/g++没得选,只能针对静态库才用局部的静态链接。

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

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

相关文章

Java Web项目实战:从零基础到项目开发全流程

Java Web开发环境搭建 Java Web开发需要Java运行环境、IDE&#xff08;如IntelliJ IDEA或Eclipse&#xff09;以及Maven集成开发工具等。首先&#xff0c;确保电脑上安装有Java 8或更高版本&#xff0c;可以通过访问Java官网获取最新版本。其次&#xff0c;安装IDE&#xff0c…

深入理解跳出率:如何利用百度统计优化网站用户体验

在数字营销的世界中&#xff0c;跳出率是一个关键指标&#xff0c;它衡量了用户对网站的第一印象和内容的吸引力。最近&#xff0c;我在分析我的网站数据时发现&#xff0c;跳出率常常高达100%&#xff0c;这促使我深入研究了跳出率的含义和影响因素。 跳出率的定义与计算 跳…

AndroidStudio Koala更改jdk版本 2024-1-2

升级android studio版本到 AndroidStudio Koala之后&#xff0c;发现修改jdk版本的方式不同了。如下&#xff1a; 修改jdk版本

《Python网络安全项目实战》

《Python网络安全项目实战》 项目1 Python 环境安装任务1.1 Windows上安装Python任务1.2 Ubuntu环境下安装Python 项目2 Python基础练习任务2.1 使用数据类型任务2.2 使用组合数据类型任务2.3 使用控制结构任务2.4 使用函数任务2.5 使用模块 项目3 处理文件中的数据任务3.1 读文…

Ajax:XMLHttpRequest

Ajax&#xff1a;XMLHttpRequest XMLHttpRequestgeturlpost 数据交换格式XMLjson XMLHttpRequest Level 2请求时限表单数据操纵文件上传 XMLHttpRequest XMLHttpRequest简称 xhr&#xff0c;是浏览器提供的 Javascript 对象&#xff0c;通过它可以请求服务器上的数据资源。 jQ…

如何在vscode中使用鼠标滑轮滚动来改变字体大小

实现内容&#xff1a;如何在vscode中使用鼠标滑轮滚动来改变字体大小 使用场景&#xff1a;我是在Ubuntu中安装的vscode 需求&#xff1a;因为最近在用这个&#xff0c;但是在使用过程中发现vscode的字体大小有点小&#xff0c;所以想改变下 实现滚轮滑动改变字体大小的具体步…

Spring Boot框架下的酒店住宿登记系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

2024 7月算法刷题记录

小米真题 手机流畅运行的秘密 时间限制&#xff1a;1.000S 空间限制&#xff1a;256MB 题目描述 8 月份发布会一结束&#xff0c;米小兔就在公司领到了一台最新发布的 Xiaomi MIX Fold 3 手机&#xff0c;这是一款小米旗舰折叠屏手机&#xff0c;并搭载了全新升级架构的 MI…

Redis 线程控制 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 线程控制 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 线程控制 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…

架构师备考-数据库设计、实施和维护

数据库设计 数据库设计的任务是针对一个给定的应用环境&#xff0c;在给定的硬件环境和操作系统及数据库管理系统等软件环境下&#xff0c;创建一个性能良好的数据库模式&#xff0c;建立数据库及其应用系统&#xff0c;使之能有效地存储和管理数据&#xff0c;满足各类用户的需…

Node.js 模块化

1. 介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为 模块化其中拆分出的 每个文件就是一个模块 &#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他模块使用 1.2 什…

Stable Diffusion视频插件Ebsynth Utility使用方法

在Stable Diffusion中安装完Ebsynth Utility后&#xff0c;就可以开始试用了。 启动Stable Diffusion后&#xff0c;出面画面&#xff1a; 1、步骤1&#xff1a;视频分帧及生成蒙板帧 填入工程目录&#xff0c;选择上传所用的视频文件&#xff1a;注意对目录命名的要求-不能有…

尽管加密货币被禁,中国仍是比特币挖矿巨头!不过主导地位正在转向美国?

尽管中国政府全面禁止了加密货币交易和挖矿活动&#xff0c;但中国依然在比特币挖矿领域保持着全球领先地位。然而&#xff0c;随着美国在该领域的快速崛起&#xff0c;中国在比特币挖矿主导地位方面正面临来自美国的强劲竞争。根据最新的市场数据和行业分析&#xff0c;中国的…

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图&#xff1a; 网络环境&#xff1a; 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

计算机网络:网络层 —— IPv4 地址的应用规划

文章目录 IPv4地址的应用规划定长的子网掩码变长的子网掩码 IPv4地址的应用规划 IPv4地址的应用规划是指将给定的 IPv4地址块 (或分类网络)划分成若干个更小的地址块(或子网)&#xff0c;并将这些地址块(或子网)分配给互联网中的不同网络&#xff0c;进而可以给各网络中的主机…

Oracle CONNECT BY、PRIOR和START WITH关键字详解

Oracle CONNECT BY、PRIOR和START WITH关键字详解 1. 基本概念2. 数据示例3. SQL示例3.1. 查询所有员工及其上级3.2. 显示层次结构3.3. 查询特定员工的子级 4. 结论 在Oracle数据库中&#xff0c;CONNECT BY、PRIOR和START WITH关键字主要用于处理层次结构数据&#xff0c;例如…

web3对象如何连接以太网络节点

实例化web3对象 当我们实例化web3对象&#xff0c;我们一般开始用本地址&#xff0c;如下 import Web3 from web3 var web3 new Web3(Web3.givenProvider || ws://localhost:5173)我们要和以太网进行交互&#xff0c;所以我们要将’ws://localhost:5173’的本地地址换成以太…

循序渐进丨openGauss / MogDB 数据库内存占用相关SQL

一、内存总体分布 数据库总体内存使用分布 select * from gs_total_memory_detail; 当dynamic_used_memory大于max_dynamic_memory就会报内存不足&#xff1b;如果此时dynamic_used_memory小于max_dynamic_memory&#xff0c;而dynamic_peak_memory大于max_dynamic_memory表…

《皮革制作与环保科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《皮革制作与环保科技》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《皮革制作与环保科技》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国轻工业联合会 …

【书籍推荐】使用 MATLAB 算法进行合成孔径雷达信号处理【附MATLAB代码】

简介 介绍了合成孔径雷达 &#xff08;SAR&#xff09; 波前重建信号理论及其数字实现的最新分析。随着快速计算和数字信息处理技术的出现&#xff0c;SAR 技术变得更加强大和准确。使用 MATLAB 算法进行合成孔径雷达信号处理解决了这些最新发展问题&#xff0c;提供了对 SAR …