35-Linux 系统上的库文件生成与使用

本文详细介绍了Linux系统中的库文件,包括静态库和共享库的生成与使用。静态库在编译时会被整合进可执行文件,而共享库在运行时动态链接。删除静态库不影响程序运行,但删除共享库会导致程序无法执行。静态库程序升级复杂,共享库则方便。了解`ldd`命令用于查看程序依赖的共享库。
摘要由CSDN通过智能技术生成

知识点:

1.删除静态库后还是可以运行的,删除共享库后不可以运行

静态库删除后可以运行,代码如下:

在这里插入图片描述

动态库删除后不能运行,代码如下:

在这里插入图片描述

2.#include <stdio.h> 用“<>”引用的头文件 都在/uesr/include 里面,数学库math.h也得指定路径(如下图)

在这里插入图片描述

3.main.c->main.o 通过预编译编译链接生成

main.o->main(或者叫main.exe) 通过链接生成

4.静态库编译出来的程序要大一点(因为会包含静态库的里面的函数)

共享库编译出来的程序要小一点(不会包含共享库里面的函数)

在这里插入图片描述

编译包含了:预编译 编译 汇编

5.Windows里共享库也叫动态链接库

6.运行程序时加载库

7.共享库程序升级的话很方便(如函数进行了更新,不需要重新编译,运行的时候就会链接信的函数)

静态库程序升级较不方便(如函数进行了更新,编译的时候需要把之前的文件删除,然后重新编译,再运行)

8.int main(int argc,char argv[],char envp[])//argc参数个数 argv参数内容 envp环境变量

9.库文件:预先编译好的方法的集合

10.(面试重点)静态库和共享库的区别:1.共享库编译出来的可执行程序不会包含共享库用到的代码,只有运行程序的时候才会去链接,而静态库编译出来的可执行程序包含了静态库用到的代码2.如果共享库被删除了,那么程序不能运行,但是静态库可以3.更新静态库后,代码需要重新编译,而共享库不用,因为共享库总是去链接

11.库文件在/lib或者/usr/lib

头文件在/usr/include

12.(面试常问)ldd可以查看可执行程序用到了哪些共享库

1.什么是库文件?

库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 或 /usr/lib。在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在/usr/include下或其子目录下。库有两种,一种是静态库,其命令规则为 libxxx.a,一种是共享库,其命令规则为 libxxx.so,如下图所示:

在这里插入图片描述

2.静态库的生成和使用:

以下是需要生成静态库的“.c”文件,其中“foo.h”中是函数的声明,“add.c”和“max.c”是函数的定义:

在这里插入图片描述

第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件

在这里插入图片描述

第二步:使用 ar 命令将第一步编译的所有”.o”文件生成静态库,其中:c 是创建库,r 是将方法添加到库中,v 显示过程

在这里插入图片描述

以下是使用静态库“libfoo.a”和“main.c”生成可执行文件的过程,其中:-L 指定库的存储路径,-l 指定库的名称(不需要前面的‘lib’和扩展名‘.a’)

在这里插入图片描述

虚拟机代码:

在这里插入图片描述

3.共享库的生成与使用

以下是需要生成共享库的”.c”文件,其中“foo.h”中是函数的声明,“add.c”和“max.c”是函数的定义:

在这里插入图片描述

第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件

在这里插入图片描述

第二步:使用 gcc 命令将第一步编译的所有”.o”文件生成共享库

在这里插入图片描述

以下是使用共享库“libfoo.so”和“main.c”生成可执行文件的过程,其中 -L 指定库的存储路径, -l 指定库的名称(不需要前面的‘lib’和扩展名‘.so’), 如果在库的存储路径有同名的共享库和静态库,gcc 默认使用共享库。

在这里插入图片描述

生成之后,直接执行 main 程序,发现出错,原因是系统加载共享库时,找不到对应的共享库文件”libfoo.so”, 但是该库确实在当前目录下存在。这是为什么呢?因为系统默认只会去存储库的标准位置(/lib 或/usr/lib 等)加载,而不会在当前位置寻找。所以将库拷贝到/usr/lib 下,再执行程序,就可以成功。如果库不在标准位置下,也可以通过设置环境变量”LD_LIBRARY_PATH”来指定加载库的路径。

在这里插入图片描述

可以通过 ldd 命令查看可执行程序使用了哪些共享库:

在这里插入图片描述

虚拟机代码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.静态库和共享库的区别

静态库在链接时将用到的方法包含到最终生成的可执行程序中,而共享库不包含,只做标记,在运行程序时,才动态加载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值