当前位置: 首页 > news >正文

软硬连接,Linux下的动静态库

光看名字,我第一时间想到的是将软件与硬件连接起来。听起来就非常让人摸棱两可。

软连接


1.本质上其实就是一个目标文件的引用,保存他的路径,类比于Windows系统下的快捷方式。

在Linux下指令:

ln -s [目标文件或目录] [链接名]

比如我们把一个可执行文件软连接

就能执行相同代码,当然我们如果改变软连接文件里面的内容当然目标文件也会发生相应的变化。
当然inode也是不相同的这意味着他们是不同的文件。

硬链接

1.本质是将目标文件建立映射关系,创建的不是独立文件,没有独立的inode

他们的引用技术都是2了,而且他们的inode的数字是相同的。当然在Linux系统,是不允许用户对目录文件创建硬链接的,为的是防止出现引用循环,出现bug

那他们两个链接最大的区别是什么呢?其实就是一个使用了引用计数,软连接是一份引用,只要将他的目标文件删除这个引用就不会存在了,但是硬链接是用了引用计数   但计数变成0之后才会正真删除目标文件。

动静态库

静态库链接方式


方法一:直接安装到系统目录

1.将.c文件编译成,o文件,创建静态库

2.我们需要将头文件粘贴到我们/usr/include/目录下,将静态库文件拷贝到/lib64/目录下


3.g++编译带l因为不是官方库所以需要带库文件名
 

方法二:直接在当前目录下链接

1.将静态库和头文件拷贝到需要链接的路径下

2.编译注意带参数,指定当前路径下的静态库

方法三:在其他路径下链接

我们先搞一个makefile

libmystdio.a:mystring.o myprint.o   #创建静态库ar -rc $@ $^
%.o:%.c                            #生成.o文件g++ -c $<.PHONY:clean                        
clean:rm -r -f *.a *.o std.PHONY:output                    #发布文件
output:mkdir -p std/includemkdir -p std/lib cp *.a std/lib cp *.h std/includetar czf std.tgz std 

这样我们就不用一次一次打了

这样我们就在当前文件下就有了std文件夹,里面有incude和lib文件夹分别装的头文件,和静态库文件。

编译:

后两个选项上面已经有参考了。
 

动态库链接

方法其实就上面那三种,就不再写了,就说说怎么生成动态库

libmystdio.so:mystring.o myprint.o  #动态库后缀为.so g++ -o $@ $^ -shared         # C语言用gcc,c++用g++ 且在后面需要用-shared
%.o:%.ccg++ -fPIC -c  $< #生成.o文件时需要添加-fPIC

当我们在其它文件里面进行动态链接时就有问题

我们的动态库会找不到,这又是为什么呢?我们在编译时是指定了动态库在哪找的,但是当我们当我们运行时是系统给我们创建的进程,当我们运行时我们又会去系统库里找动态库文件。所以就会报错。
所以我们如何解决呢?

1.第一种就是方法一(略)

2

3.

如果我们动态库与静态库都提供那会先用哪个呢?

答案是动态库,如果想要指定用静态则需要在g++后面加上-static


http://www.mrgr.cn/news/54653.html

相关文章:

  • 第十八课:Python学习之多态
  • Pytorch常用函数汇总【持续更新】
  • Docker 入门 - 拉取/创建镜像 + 运行和管理容器
  • leetcode22.括号生成
  • Vue前端开发2.2 数据绑定
  • 深入了解Spring重试组件spring-retry
  • Nat Comput Sci | 分而治之!基于子任务分解的单细胞扰动人工智能模型 STAMP
  • 洛谷 P1038 [NOIP2003 提高组] 神经网络(拓扑排序)
  • Redis之持久化机制和实现原理
  • C/C++程序员为什么要了解汇编?汇编语言的好处与学习路径详解
  • Python进阶语法
  • Vue request请求拦截 全局拦截Promise后 api请求捕获异常catch
  • day3:管道,解压缩,vim
  • 写一段代码判断素数的函数,从主函数中输出一个整数,判断它是否为素数。
  • ret2reg
  • 分布式缓存的基本概念入门以及如何保证数据一致性
  • Mysql数据库压缩版的卸载、安装及初始化
  • c++ 对象作用域
  • Java 类和对象详解(下)
  • Leetcode 3327. Check if DFS Strings Are Palindromes
  • 【动态规划】【路径问题】下降路经最小和、最小路径和、地下城游戏
  • 15. 三数之和 双指针经典题目
  • 【MySQL】to_date()日期转换
  • 模拟器芯片巨头 ADI 亚德诺半导体 Analog Devices 产品的应用介绍和物料推荐(六)
  • 【软件工程】过程和生命周期的建模
  • Android常用C++特性之std::bind