从零开始学习Linux(10)----动静态库

目录

1.制作静态库

1.编写源代码

2.编译

3.打包库

4.使用库

2.制作动态库

1.编译

2.打包库

3.总结

3.理解动态库加载

1.站在系统角度理解

2.谈谈编址,可执行程序


1.制作静态库

1.编写源代码

假设你编写了两个源代码文件mymath.c和myprintf.c以及它们对应的头文件。

2.编译

gcc -c mymath.c
gcc -c myprintf.c

将源文件编译为.o文件 。

3.打包库

ar -rc libmyc.a mymath.o myprintf.o

使用ar命令将两个.o文件打包为静态库,名称为去掉lib前缀和.a后缀的myc。

4.使用库

gcc main.c -lmyc -L .

如果你要在main.c中使用你的库,-lmyc指定你想要使用的库,-L .指定在当前目录下寻找库。

此时就可以运行你的main.c程序了!

2.制作动态库

1.编译

gcc -c -fPIC mymath.c
gcc -c -fPIC myprintf.c

fPIC为产生位置无关码

2.打包库

        shared:表示生成共享库格式

gcc -o main.c -I ./mylib/include

-I选项为可以在它指定的路径下搜索头文件

        静态库只要编译成功,动态库还需要运行成功,将库安装到系统中,既可以支持编译,又可以支持运行,有以下几种方法可以安装。

1.直接将库拷贝到系统中。

2.$LD_LIBRARY_PATH,该环境变量是系统运行程序时,动态库查找的辅助路径,将不再系统默认库搜索路径下的库路径,添加到LD_LIBRARY_PATH中。

3.通过软链接方式。

3.总结

        如果我们同时提供动态库和静态库,gcc默认使用的是动态库,如果我们非要静态连接,我们必须使用static选项,如果我们只提供静态库,那我们的可执行程序只能对该库进行静态连接,但是程序不一定整体是静态连接的,如果我们只提供动态库,默认只能动态连接,非得静态连接,会发生连接报错。

3.理解动态库加载

1.站在系统角度理解

        库函数的调用,依旧是在进程的地址空间中进行的,动态库加载之后,会被映射到进程的共享区中,谁来决定,那些库加载了,哪些库没加载:OS会自动完成。系统中可不可以同时存在非常多的已经加载的库呢?是,操作系统要管理库,先描述,再组织。本质:所有系统进程中公共的代码和数据,只需要存在一份。

2.谈谈编址,可执行程序

        可执行程序本身是有自己的格式信息的,我们进程地址空间里面的很多地址数据,是从可执行程序中来的,虚拟地址空间本身不仅是OS要遵守,编译器编译也要遵守,如果我们的可执行程序,没有被加载到内存中,我们的程序中没有地址呢:本来就有地址,其实我们的可执行程序,在没有加载之前,也已经基本被按照类别已经将可执行程序划分为各个区域了。   

  • 当动态库被加载时,它的代码和数据会被加载到物理内存中。
  • 动态库加载后,会被映射到该进程的地址空间中。具体来说,是先在页表中填写好对应虚拟地址和物理地址之间的映射关系,才被映射到进程地址空间中的共享区中。
  • 如果此时另一个进程也要加载该动态库,只需要填写它的页表的映射关系即可,不需要再从磁盘中加载一份动态库代码和数据,如果所需库不在内存中才需要加载。
  • 这样就保证了一个动态库最多只在内存中存在一份,大大节省了内存开销。
  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值