linux之静态库与动态库

article/2025/8/30 6:44:22

我们在写c语言的时候,经常会去包含一个.h的头文件,这个头文件就是库文件,比如<stdio.h>,<stdlib.h>这些都是标准的头文件,一般放在/usr/include,也就是说,从这个目录中我们可以找到这个头文件,然后调用它的库里面的方法,当然这些库是gcc帮助我们自动链接的,那么这里就延伸出了一个问题,不在标准库里面的头文件,我们怎么引用,也就是我们自己的头文件怎么引用?,

那么用一张图先来说明一下,介绍一下头文件的用法与作用:

比如我们做一个没有引入.h文件的库:

add.c

minus.c

 

先把这两个文件函数做成一个动态库:

 

 

然后移动到相应我们存放自己库文件位置:

然后demo1.c测试一把,注意我们没有引入头文件

 运行

所以,头文件是不是可以不加,但是其实不然 ,头文件可以帮我们定义数据类型,规范函数接口,就当相于是一个手册参考

OK,话不多说,上代码:

上面就是我在/home/pxx/include下面放的我自己的头文件,在/home/pxx/lib放的我的库文件,这是一个静态库,至于静态库怎么来制作,我们后面再来说。 

然后我在/home/pxx/c里面放的我的测试文件demo2.c

demo2.c:

  1 #include <stdio.h>2 #include <stdlib.h>3 #include "add.h"4 5 int main()6 {7         int res1 = add(1,2);8         int res2 = sum(2,3);9         printf("%d  %d\n",res1,res2);10         return 0;11 }

 上面就是引用我们add.h的头文件,这个文件默认会去找当前目录有没有这个头文件,没有就去找我们指定的地方,然后去调用实现它的库文件。

下面我们来编译一下,首先我们看第一个情况,链接了头文件没有链接库文件:

 再来看一个情况,我们链接了库,但是没链接头:

 下面看一个标准链接:

 下面来具体说一下静态库与动态库:

一张图说明什么是静态库与动态库:

下面说一下静态库与动态库的制作方法:

我们在使用库的时候,往往是与头文件一起使用的,头文件定义函数,库文件实现函数。另外就是,我们一般用动态链接库比较多,节约内存嘛,然后就是整体升级也方便。但是如果你要考虑程序的移植性,就考虑用静态库吧。

话不多说,上代码。

静态库太简单,不说了,这里重点说一下动态库:

add.h:(/home/pxx/include)

  1 #ifndef  _ADD_H_2 #define  _ADD_H_3 4 5 int add(int num1,int num2);6  7 #endif

 add.c:(/home/pxx/include)

  1 #include <stdio.h>2 #include <stdlib.h>3 4 int add(int num1,int num2)5 {6         return num1 + num2;7 }
~             

然后编译成.o文件用来制作动态库:

 

然后我们在来制作成动态库:

现在可以把这个共享库放到/home/pxx/lib里面:

 现在去到我们/home/pxx/c里面:

demo3.c:

  1 #include <stdio.h>2 #include <stdlib.h>3 #include "add.h"4 5 6 int main()7 {8         int res = add(1,2);9         printf("%d\n",res);10         return 0;11 }

现在我们来链接一下共享库,调用这个函数:

上面很明显的有一个出现一个问题,这个问题的出现也说明了一个问题,就是我们在gcc链接库的时候没有报这个错误,运行程序的时候才报错,说明,动态库就是在链接的时候运行的。

我们来分析一下为什么提示找不到这个文件或者目录呢

ldd->可以查看可执行文件的可依赖的库文件

很明显libadd1.so找不到,那么下面就要延伸一个文件路径查找问题:

我们不是在编译程序的时候加入了-L/home/pxx/lib这个库文件位置吗,为什么还会提醒我们找不到。

那是因为库文件没有加载到环境变量中,因此程序在加载库的时候,就无法找到它的绝对路径,然后就无法加载到内存中。那么如何把这个库加入到环境变量中,下面给又得延伸一个可执行程序路径查找问题,一般来说可执行程序是elf格式的,那么我们就必须知道elf格式文件路径是怎么查找的。先来看一下dmeo3可执行文件是否是elf格式:

上面很明显看到demo3是elf格式的文件,那么现在说一下elf格式文件路径查找:

那么我们只要在上面任何一个设置好共享库的位置,就肯定可以让我们的共享库加载到内存中

那么说一下解决办法:

我们用推荐的方法:

注意.bashrc是一个隐藏文件 

 

再来ldd一下执行文件,看看我们需要的库是否都找到了

 然后我们运行

我们也可以去测试一下其他方法都可以找到动态库的问题。好了,就说到这吧。 


http://chatgpt.dhexx.cn/article/xDmKPJtR.shtml

相关文章

理解和创建Windows和Linux下的动态和静态库区别

一、引言 在计算机编程的世界中&#xff0c;库是一个非常重要的改变。它的出现提供了一种共享和重用代码的可能性&#xff0c;复杂的程序因为动态库的出现而变得简洁和方便。然而&#xff0c;库并不是单一的&#xff1a;它们可以是动态的&#xff0c;也可以是静态的&#xff0…

静态库与动态库的区别和使用

动静态库所用到的一些库文件&#xff1a; .o 是目标对象文件,相当于windows中的.obj文件。可由一个或多个.c /.cpp来生成 .a 为静态库&#xff0c;可以是一个或多个.o合在一起,用于静态连接&#xff1b;多个.o文件可以链接生成一个.exe的可执行文件。静态库在程序编译时会被连…

静态库和动态库的使用与区别

引文 库文件是计算机上的一类文件&#xff0c;可以理解为一种代码仓库&#xff0c;提供给使用者一些可以直接使用的变量、函数或类。 库文件分为两类&#xff1a; 静态库&#xff1a;在链接阶段&#xff0c;会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中…

【Linux静态库和动态库】

Linux静态库和动态库 1. 编译与ELF格式2. 库的基本概念3.静态库的制作&#xff1a;&#xff08;假设要将a.c、b.c制作成静态库&#xff09;4.静态库的常见操作5.静态库的使用6. 多个库的相互依赖举例1.(库文件制作、错误处理) 7.静态库和动态库的关系和区别8.动态库的制作软链接…

如何理解静态库与动态库

究竟什么是库&#xff1a; 日常生活中有很多所谓的库&#xff0c;比如车库啊&#xff0c;优衣库啊&#xff0c;甚至还有一库&#xff08;日语&#xff09;咳咳。然后对程序员来说&#xff0c;所谓的库&#xff0c;即是程序库&#xff0c;当一段代码十分耐用&#xff0c;又经过…

C++静态库与动态库的区别

文章目录 什么是库静态库Linux下创建与使用静态库Windows下创建与使用静态库 动态库Linux下创建与使用动态库Windows下创建与使用动态库 动态库的显式调用在Linux下显式调用动态库在Windows下显式调用动态库显式调用C动态库注意点 附件&#xff1a;Linux下库相关命令g(gcc)编译…

动态库静态库的区别

1、动态库以及静态库区别 静态库是函数和数据编译进一个二进制文件里面&#xff08;.lib文件&#xff09;&#xff0c;在使用静态库链接成可执行程序的时候&#xff0c;链接器会复制静态库内的函数和数据进可执行程序里面(.EXE文件)&#xff0c;所以在加载库的时候不需要加载相…

详谈静态库和动态库的区别

一、什么是库&#xff1a; 库是写好的&#xff0c;现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说&#xff0c;库是一种可执行代…

【C语言】详解#define,#ifdef,#ifndef,#elif,#undef,以及相关运算符

1.明示常量 #define 预处理指令结尾不带&#xff1b;&#xff08;分号&#xff09;&#xff0c;在预编译的过程中使用宏的地方会进行展开&#xff0c;是用多少次就展开多少次&#xff0c;但是只替换 不计算&#xff0c;预处理器在发现程序中的宏后&#xff0c;会用宏等价的替换…

Vue 项目报错:‘$‘ is not defined ( no-undef )

错误描述 报错如上图所示&#xff0c;错误原因是不认识 $ 符&#xff0c;他是 JQuery 中得符号&#xff0c;我也确实引入了 JQuery&#xff1a; 解决办法 在 vue 项目的根目录下创建一个 .eslinttrc.js 文件&#xff0c;文件内容如下&#xff1a; module.exports {root: true…

undefined和is not defined区别

undefined定义&#xff1a; undefined是javascript的一种基本数据类型&#xff0c;变量未赋值或者函数没有返回值时返回。 xxx is not defined是一种错误类型&#xff0c;其完整形式是&#xff1a;Uncaught ReferenceError: xxx is not defined&#xff08;未捕获的引用错误&a…

#define #undef等基本知识

1、预处理符号 例子&#xff1a; #include <stdio.h> #define DEBUG_PRINT printf("FILE %s line %d:" \"x%d, y%d, z%d," \__FILE__,__LINE__,x,y,z) //或者如下: //#define DEBUG_PRINT printf( "File %s line %d:…

undefined和is not defined一样吗?

https://blog.csdn.net/sheldon178/article/details/48298151/ undefined和is not defined&#xff0c;字面意思看来没什么两样&#xff0c;不都是未定义吗&#xff1f; 在JavaScript中&#xff0c;可并非如此。 undefined定义如下&#xff1a; undefined是javascript的一种…

C++中 #define 与 #undef

define 宏指令 #define 与 # include类似,它的好处呢就是速度快,使用define定义函数可以减少函数调用的额外开销 define 主要体现在2个地方 1 定义一个值 2 定义一个函数或者说功能 #include <iostream> using namespace std; // 定义一个值 #define HELLO_WORLD "…

#define #undef 使用

#define 是宏定义 #define 的用法是非常多功能的&#xff0c;它不止能实现常量宏定义&#xff0c;开关&#xff0c;还能实现函数 #undef 是取消宏定义 在undef后面要加上你要取消的宏定义 不想取消在后面可以瞎写但是不能为空 例子 #include "stdio.h"int main(…

C语言 #undef的用法

C语言中#undef的语法定义是&#xff1a;#undef 标识符&#xff0c;用来将前面定义的宏标识符取消定义。 然而&#xff0c;在实际应用中&#xff0c;#undef到底可以用来做什么&#xff1f; 整理了如下几种#undef的常见用法。 1. 防止宏定义冲突 在一个程序块中用完宏定义后&…

Perl学习-undef值和defined函数

undef值 undef是未定义的意思&#xff0c;在Perl中&#xff0c;会假设undef的变量时0或者空字符串 如果当成数字&#xff0c;就是0如果当成字符串&#xff0c;就是空字符串 当成数字 1 $n 1;2 3 while($n < 10){4 $sum $n;5 $n 2;6 }7 8 print "The tota…

吊打迅雷,最好用的BT种子下载器,下载不限速

今天小七要给大家带来的是一款安卓端BT下载器&#xff0c;用它来找片&#xff0c;下片&#xff0c;简直爽到极点&#xff0c;目前完全免费&#xff0c;无广告、无会员限制、极速下载、运行稳定支持多种格子解析、支持边下边播等等&#xff0c;拥有迅雷的所有功能&#xff0c;同…

比迅雷好用,下载速度快5倍的下载软件IDM(Internet Download Manager)

家好&#xff0c;很高兴大家阅读本文章&#xff0c;我一直在做自媒体&#xff0c;而且自媒体现在也当自己的一份工作来做了&#xff0c;那么在做自媒体的过程&#xff0c;肯定也会需要找素材&#xff0c;而在找素材的过程中需要用到下载工具&#xff0c;大家说说看现在国内&…

视频下载神器,支持 80+ 网站,比迅雷还快!

点击上方“逆锋起笔”&#xff0c;公众号回复 编程资源 领取大佬们推荐的学习资料开源最前线(ID:OpenSourceTop)编译 项目地址&#xff1a;https://github.com/soimort/you-get 今天&#xff0c;推荐一款下载神器&#xff0c;秒杀市面上你知道的所有下载工具&#xff0c;它就是…