iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >【Linux】静态库和动态库
  • 500
分享到

【Linux】静态库和动态库

linux服务器运维 2023-09-07 10:09:26 500人浏览 泡泡鱼
摘要

linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。假设我们是超级用户,允许给目录建立硬链接,给根目录建立硬链接,从根目录开始查找,当查找硬链接的时候就是根目录,这

linux为什么不允许普通用户给目录建立硬链接呢?

image-20230116092715777

系统层面上有.和…硬链接指向目录。假设我们是超级用户,允许给目录建立硬链接,给根目录建立硬链接,从根目录开始查找,当查找硬链接的时候就是根目录,这时候递归式查找,形成了环路查找,最后导致软件无法正常进行查找工作!所以不允许普通用户给目录建立硬链接。

文章目录

一、动态库和静态库

具体的动态库和静态库的相关内容👉点击跳转

Linux的库一般分为动态库和静态库:

静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库(.so):库文件以.so为后缀,程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

链接的本质:无非就是我们调用库函数的时候和标准库是如何关联的问题

库的名称:去掉前缀lib去掉后缀.so/.a剩下的就是库名称,比如libc.so就是C库

gcc 在编译时默认使用动态链接,而生成静态链接,我们需要在末尾带上-static:

img

安装静态库:

sudo yum install -y glibc-staticsudo yum install -y libstdc++-static

二、理解库

如果不想给对方我们的源代码,我们可以选择给用户提供我们的.o可重定位目标二进制文件(gcc -c 文件)与.h头文件。让用户用我们提供的.o文件进行链接即可。在编译时,只要把源文件编译成.o文件在将其链接便可形成一个可执行的程序

img

通过GCc -o生成,不出意外,编译运行成功:

image-20230116133214810

难道就这么简单吗?我们可以给对方提供.o(方法的实现),同时还有提供.h(里面包含着都有哪些方法),此时对方是能用的。但是如果存在很多.c文件呢?难道我们要把几千个.c文件全部编译成.o在加上头文件全部一个一个提供吗?那样太过于麻烦,为了让用户更好的使用库,我们就有把所有的.o文件打成一个包,给对方提供一个库文件即可!把多个.o合并成一个文件,这个文件就是库,把包方式的不同就分为了动态库和静态库*。

库的本质就是.o文件的集合。


准备的文件:

image-20230118130259209

三、制作静态库

我们如果想自己写一个库,要不要在这个库里面写main函数呢?答案肯定是不要的,库是被别人用的,自己写的main会和库里的main发生冲突。我们可以站在编写库的角度和使用者的角度来制作:

编写库:创建Makefile:

image-20230117175841393

将文件编译成.o文件

ar命令:把所有的.o打包起来,ar是归档。

-rc代表replace和create;比如:

ar -rc libmymath.a my_add.o my_sub.o

output:而我们要交付库,实际上要把库文件a.so以及匹配的头文件都交付给用户,而output就是一个发布的过程

image-20230117182852030

使用

image-20230117222131413

image-20230117215933458

此时,我们用户如果需要只要把mylib.tgz拷贝过去:比如:cp mylib.tgz …/test,拷贝过去之后进行解压: tar xzf mylib.tgz

image-20230117222548962

而所谓的安装其实就是在拷贝。直接把安装好的库使用起来:

头文件找不到?

编译器搜索头文件时默认在当前目录下搜索,在系统默认指定路径下搜索。虽然此时的mylib在当前路径下,但是头文件太深了,编译器找不到头文件,所以我们需要给gcc指定路径。带上-I ,指明在当前目录下的mylib目录下查找

image-20230117225023455

问题又来了,找不到库函数的实现。我们在形成可执行程序的时候,库文件要使用的话也要知道库所在的路径在哪里,系统的默认路径是/lib64。所以我们要带上-L。告诉库的路径在哪里。

但是如果要链接第三方的库,必须去指明库的名称(注意去掉前缀和后缀!)!!!也就是说,一定要告知路径下哪一个库,即使只有一个库,也要明确告知gcc要链接哪一个库(虽然我们以前写代码的时候,从来没有指明过库名称,这是因为gcc/g++默认帮我们填了,可以识别C/C++自带的库。自己写的要指明)

image-20230117231655995

最终终于顺利完成!

上面说了那么多,总结一下:

-I:指明头文件的搜索路径

-L:指明库文件的搜索路径

-l:指明要链接哪个库,带上库的名称(去掉前缀和后缀)

gcc默认是动态链接的(建议行为)对于特定的一个库,究竟是动静态库,取决你提供的是动态库还是静态库。

库的安装(把库安装到系统头文件路径下):

把头文件和库文件拷贝进系统的路径下,gcc对于头文件的默认路径是:/usr.include;对于库文件的默认路径是:/lib64:

image-20230117235724073

但是不太推荐这样使用:第三方库并没有经过测试,自己写的会污染库里面的其他文件。


四、制作动态库

首先我们需要把库文件全部编译成.o文件,这里与静态库不同,需要带上选项 -fPIC,形成与位置无关码:

gcc -c -fPIC my_add.c

什么是与位置的无关码的目标二进制文件:

静态库采用的是绝对编址

动态库采用的是相对编址,动态库中的指定函数的地址通过相对编址(库中的偏移地址+段起始地址):

image-20230118134110242

动态库打包:-shared

gcc -shared -o libmymath.so my_add.o my_sub.o

image-20230118105431940

image-20230118110420288

使用动态库

image-20230118110927754

但是这样子就可以吗?我们直接运行mymath:

image-20230118111042185

运行不了,这是为什么?找不到库

我们此时已经告诉了库文件,路径和库名称,选项已经给gcc带上了。但是我们当编译完之后,和gcc还有关系吗?答案是无关的,接下来运行是和OS有关的,动态库是运行时才加载的,所以程序运行起来,OS和shell也是需要知道库是在哪里的!而我们自己制作的库并没有在系统路径下,OS无法找到!如何找到动态库:

把库路径添加到环境变量LD_LIBRARY_PATH,比如当前自己制作库的路径是 /home/hwc/dir/test/mylib/lib

image-20230118113229401

直接运行:

image-20230118113256657

但是我们自己定义的环境变量只是本次登录有效,如果想永久有效只能修改环境变量的配置,但是比较麻烦。想永久有效,除了把库拷贝到系统目录下之外,我们还有其他方法:

配置文件(/etc/ld.so.conf.d/):动态库进行对应搜索时可以采用自己定义conf文件找到动态库

image-20230118115114624

建立软链接直接找到对应的库

image-20230118121302599

把对应的动态库建立在系统的目录下:

image-20230118121733222

总结一下:

运行动态库

1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib

2、更改 LD_LIBRARY_PATH

3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

4.创建软链接


五、动静态库的加载

静态库不需要加载,静态库把代码拷贝到可执行程序里,直接决定了当加载的时候在内存里代码和数据可能存在多份,会比较浪费空间,把静态库中拷贝到程序中的代码区里:

image-20230118135744938

动态库加上fPIC形成位置无关码,采用相对编址方案,在程序链接时对应库当中的偏移量添加到可执行程序,运行时一旦库加载进来,经过地址空间映射,把库映射到地址空间之后,库也就具备了起始地址,通过偏移地址和起始地址这样就可以找到访问的函数:

image-20230118141601439

系统层面上会维护动态库的起始地址,直接建立页表与内存的映射,也就可以跳转访问了,所以动态库加载一次就可以被多个进程共同使用了。而静态库可能有多个程序用了C库,加载到内存时,内存里可能会存在100份重复的代码。而动态链接不会出现重复的代码,减少内存。

来源地址:https://blog.csdn.net/weixin_60478154/article/details/128726144

--结束END--

本文标题: 【Linux】静态库和动态库

本文链接: https://www.lsjlt.com/news/398037.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【Linux】静态库和动态库
    Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。假设我们是超级用户,允许给目录建立硬链接,给根目录建立硬链接,从根目录开始查找,当查找硬链接的时候就是根目录,这...
    99+
    2023-09-07
    linux 服务器 运维
  • 【Linux】动静态库
    文章目录 动静态库1. 设计库1. 静态库打包只有一个.o的压缩包报错1创建.o与.h的压缩包报错2第三方库的使用将头文件和库拷贝对应的系统路径 2. 动态库打包报错运行时报错找到动态...
    99+
    2023-09-02
    linux 运维 服务器
  • linux中怎么生成动态库和静态库
    linux中怎么生成动态库和静态库,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。动态库的生成:代码如下:#include <stdio.h>#include &...
    99+
    2023-06-09
  • Linux动态库和静态库的示例分析
    今天就跟大家聊聊有关Linux动态库和静态库的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。函数库分为静态库和动态库两种。创建Linux静态库和Linux动态库和使用它们在这...
    99+
    2023-06-16
  • Linux静态库与动态库如何制作
    这篇“Linux静态库与动态库如何制作”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux静态库与动态库如何制作”文章吧...
    99+
    2023-06-27
  • linux中动态库和静态库的区别有哪些
    这篇文章将为大家详细讲解有关linux中动态库和静态库的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。区别:1、静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库;动态库在程序...
    99+
    2023-06-25
  • Linux静态函数库和动态函数库是什么
    这篇文章主要介绍“Linux静态函数库和动态函数库是什么”,在日常操作中,相信很多人在Linux静态函数库和动态函数库是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux静态函数库和动态函数库是什么...
    99+
    2023-06-28
  • 动态库和静态库有什么区别
    这篇文章主要介绍“动态库和静态库有什么区别”,在日常操作中,相信很多人在动态库和静态库有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”动态库和静态库有什么区别”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-20
  • linux静态库和动态库的创建与使用方法
    这篇文章主要介绍“linux静态库和动态库的创建与使用方法”,在日常操作中,相信很多人在linux静态库和动态库的创建与使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux静态库和动态库的创建与使...
    99+
    2023-06-13
  • 如何在 Linux 中使用动态和静态库
    本篇内容介绍了“如何在 Linux 中使用动态和静态库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!了解 Linux 如何使用库,包括静态库...
    99+
    2023-06-15
  • mfc静态库和动态库有什么区别
    静态库和动态库的区别在于它们在编译时和链接时的处理方式不同。 静态库是在编译时被链接到目标文件中,因此编译后的可执行文件会包...
    99+
    2024-03-02
    mfc
  • C++Cmake的构建静态库和动态库详解
    目录静态库和动态库的区别构建示例ADD_LIBRARY同时构建静态和动态库SET_TARGET_PROPERTIES动态库的版本号安装共享库和头文件使用外部共享库和头文件解决 :ma...
    99+
    2024-04-02
  • linux下静态链接库和动态链接库的区别有哪些
    这篇文章主要讲解了“linux下静态链接库和动态链接库的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下静态链接库和动态链接库的区别有哪...
    99+
    2023-02-07
    linux
  • C++中Cmake的构建静态库和动态库是什么
    这篇文章主要为大家展示了“C++中Cmake的构建静态库和动态库是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中Cmake的构建静态库和动态库是什么”这篇文章吧。静态库和动态库的区别...
    99+
    2023-06-29
  • C++静态库与动态库文件怎么生成和使用
    这篇文章主要介绍“C++静态库与动态库文件怎么生成和使用”,在日常操作中,相信很多人在C++静态库与动态库文件怎么生成和使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++静态库与动态库文件怎么生成和使用...
    99+
    2023-07-05
  • GCC指令及动态库、静态库怎么使用
    本文小编为大家详细介绍“GCC指令及动态库、静态库怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“GCC指令及动态库、静态库怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、GCC1.1 GCC ...
    99+
    2023-07-04
  • FlutteriOS开发OC混编Swift动态库和静态库问题填坑
    目录引言OC接入Swift 插件静态库和 Framework 区别新的问题: non-modular heade不能在Framework Module中使用非Modular 的 He...
    99+
    2024-04-02
  • VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码
    目录1. 静态库和动态库 1.1. 静态链接库1.1. 动态链接库2. 使用VisualStudio构建演示2.1. 静态库构建演示3. 总结1. 静态库和动态库 &nbs...
    99+
    2024-04-02
  • GCC 指令详解及动态库、静态库的使用方法
    目录一、GCC1.1 GCC 介绍1.2 安装 GCC1.3 GCC 工作流程1.3.1 一般使用流程1.3.2 详细的工作流程1.4 GCC 常用参数1.4.1 指定一个宏(-D)...
    99+
    2022-11-13
    GCC 指令 GCC使用动态库 GCC使用静态库
  • C语言编程gcc如何生成静态库.a和动态库.so示例详解
    目录一、什么是静态库和动态库二、gcc生成.a静态库和.so动态库1.生成静态库(.a)1.1编辑生成例子程序hello.h、hello.c和main.c1.2将hello.c编译成...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作