软连接是一个独立的文件,其内容是目标文件的路径。
也就是类似windows的快捷方式
引用计数变为2(也就是硬链接数),是同一个文件
用软连接来快速访问(硬链接用的少一些)
///软硬链接和静态库后面会再写一篇
生成name.o文件
fPIC:产生位置无关码(后面再讲)
动态库打包只需要使用gcc
shared 生成共享库格式
补充:makefile语法
$^:表示依赖当前目录下所有文件
$<:表示将一个一个的取出文件,并执行相应的命令
比如当前目录下有是个.c文件 那gcc命令就会执行十次
%.o:表示所有后缀为.o的文件
因为我们写的库是第三方库 所以编译文件的时候 需要说明你链接的是哪个库
并且由于gcc一般是在默认路径下去搜索库的
而你写的库在当前路径下 gcc找不到
所以我们就需要说明库在哪:-L
补充: ldd file
查看这个个文件会链接到哪个库
我们先将所有头文件(include文件夹)和静态库(lib文件夹)打包进一个压缩包(mylib)内
然后创建user文件夹(假设是用户)
进入user目录 复制(下载)压缩包并解压
这就模拟了我们在网站上下载库的过程
报错了 找不到lib里的头文件
我们就需要用 -I https://blog.csdn.net/cat_with_cat/article/details/mylib/include 来表示我们编译需要的头文件在哪
仍然链接报错了
这回是链接错误 和上一小节一样 你没有指明库在那里
那么我们就可以把这些拷贝到默认路径下
这就是安装!
而这些默认路径的创建一般是root创建
这就是为什么下载 移动 复制 都需要sudo
拷贝完就可以简写成
又错辣!
显示找不到libmyname.so这个文件 静态库就没这个问题(因为静态库编译完就没事了
我们前面虽然告诉了编译器 库在那里,但操作系统在执行可执行程序(mytest)的时候 并不知道
- sudo cp mylib/lib/* /lib64
把写的拷贝到默认路径 - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xx/xx/xx/mylib/lib
LD_LIBRARY_PATH:系统运行程序时,动态库查找的辅助路径 - sudo ln -s /xxx
- sudo touch /etc/ld.so.conf/myconf.cof
etc/ld.so.conf/
这是存放用户自己用的配置文件的目录
我们就可以在这个配置文件里放入库的路径
补充:ldconfig
意思是让更改的配置文件生效
补充:编译
gcc默认使用动态库
使用-static 就进行静态链接
只提供静态库的话,虽然是静态链接 但程序整体不一定是静态的
只提供动态库的话,无法静态链接(static)
像是可执行程序、库都是磁盘文件 当需要这个库的时候 库的代码和数据会加载到物理内存中,
当某个进程需要的时候 就会被映射到进程的共享区内,
当其他进程需要的时候,同理也是映射到共享区内,这就是动态库(共享库)
那么公共的代码和数据 只需要存在一份
当没加载到内存的时候 可执行程序是有地址的,他们在没有加载之前 已经被按照类别(权限,属性)进行划分
- cpu中 寄存器cr3指向页表,寄存器pc指针保存的正在执行指令的下一条指令
- 我们知道可执行程序在磁盘中,他的每一条汇编指令都有自己的逻辑地址(相对地址和绝对地址),大部分操作系统采用的都是相对地址,即0加上偏移量
- 而在可执行程序程序的最前面有表头,他写着main函数的逻辑地址,整个程序的区域划分和每个区域的起始地址,方便初始化进程的时候知道要开多大的数据区合适
- 而可执行程序在执行的时候,会在物理内存中开辟相应的地址,这时候逻辑地址变为了虚拟地址(在linux中 二者相同)
- 所以,页表中就是虚拟地址和物理地址的映射
结论:地址空间,是由OS+编译器+计算机体系结构(CPU)共同完成的
静态库就是把库里的方法直接以绝对编址的方式写到可执行程序里
库加载的内存时,只记录每条指令的偏移量,起始地址是不固定的(采用相对编址的方式)
到此这篇动态库和静态库的区别是什么(静态库和动态库的概念)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/81013.html