前言

上一篇分享了静态链接与动态链接的实验(Windows下)。这一篇分享Linux下的笔记,同时对上一篇笔记做一个补充。

首先,我们把静态链接与动态链接做一个这样子的比喻:

把链接过程看做我们平时学习时做笔记的过程。我们平时学习时准备一本笔记本专门记录我们的学习笔记,比如在某本书的某一页上看到一个很好很有用的知识,这时候我们有两种方法记录在我们的笔记本上,一种是直接把那一页的内容全部抄写一遍到笔记本上(静态链接);另一种是我们在笔记本上做个简单的记录(动态链接),比如写上:xxx知识点在《xxx》的xxx页。

从这两种方法中我们可以很清楚地知道两种方式的特点,第一种方式的优点就是我们在复习的时候就很方便,不用翻阅其它书籍了,但是缺点也很明显,就是占用笔记本的空间很多,这种方法很快就把我们的笔记本给写满了。第二种方式的优点就是很省空间,缺点就是每当我们复习的时候,手头上必须备着相关的参考书籍,比如我们去教室复习的时候,就得背着一大摞书去复习,这样我们复习的效率可能就没有那么高了。

这对应到我们的动态链接与静态链接上是不是就很好理解了:

静态链接与动态链接的主要优缺点

(1)静态链接的优缺点:

优点:

  • 代码装载速度快,执行速度略比动态链接库快;

缺点:

  • 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费。

(2)动态链接的优缺点:

优点:

  • 生成的可执行文件较静态链接生成的可执行文件小;

缺点:

  • 速度比静态链接慢;

动态、静态链接实验

我们先编写如下代码(共三个文件):

文件1(main.c):

#include "test.h"​void print_hello(void){    printf("hello world");}

文件2(test.c):

#ifndef __TEST_H#define __TEST_H​#include ​void print_hello(void);​#endif

文件3(test.h):

#ifndef __TEST_H#define __TEST_H#include void print_hello(void);#endif

1、动态链接实验

首先,将源文件生成目标文件(*.o),命令:

gcc -c -fPIC main.c test.c

这里得根据实际编译环境加上或者不加上-fPIC参数,这个是与gcc的版本有关,像我这边的gcc 5.4.0就得显示加上-fPIC这个参数,若是不加,则会影响下一步的链接过程。

在Linux中,动态库的扩展名一般为.so。针对上面生成的test.o文件,生成动态库的命令为:

gcc -shared test.o -o libtest_d.so

若是上一步不加-fPIC参数,则会产生如下错误:

大概意思就是.rodata不可以拿来制作共享文件,请加上-fPIC参数重新编译。问题分析:

-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

从gcc来看,shared应该是包含fPIC选项的,但似乎不是所有的版本都支持,所以最好显式加上fPIC选项。

使用链接动态库的方式生成可执行程序,命令:

gcc main.o -L. -ltest_d -o test_d.out

这里的-L.的含义是在搜索库文件时包含当前目录,-ltest_d的含义是链接名称为libtest_d.so的动态链接库。

下面运行test_d.out程序,发现出现如下错误:

不能找到共享库文件libtest_d.so,加载失败。因为一般情况下Linux会在/usr/lib路径中搜索需要用到的库,而libtest_d.so库并不在这个路径下。解决方法有两种:一种就是把这个文件拷贝至/usr/lib路径下,但是一般不允许这样做,一般用户也不允许往这个路径里拷贝东西。另一种就是把当前路径增加为动态库的搜索路径,命令为:

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

这时候就可以正常运行了:

2、静态链接实验

静态库用ar工具来制作。ar是一个归档工具,用于建立、修改、提取归档文件(archive)。一个归档文件可以包含多个目标文件,也被称为静态库。在Linux下,静态库的扩展名一般为.a。

把目标文件test.o做成静态库,命令:

ar -rv libtest_s.a test.o

其中rv参数为组合参数,其中r参数表示当建立的模块名已经存在时,则覆盖同名模块,v参数用来显示附加信息,比如被处理的文件的名字。

使用链接静态库的方法生成可执行程序,命令:

gcc main.o -L. -ltest_s -o test_s.out

运行程序:

删除静态库之后,可执行程序也是能正常运行的。事实上,使用链接静态库的方式生成的可执行程序与直接使用目标文件生成的可执行程序没有区别。只是经过了静态库的链接,变为了一个文件,方便于调用、移植和保存。

归档工具ar可以很方便地查看和删除归档文件中的成员。

查看静态库libtest_s.a中的内容,命令:

关于ar工具更多的命令参数可输入ar --help进行查看:

以上就是关于静态链接与动态链接的Linux笔记,如有错误,欢迎指出!

装入归档文件时出现了一个错误linux_静态链接与动态链接(Linux)相关推荐

  1. linux上归档文件无法提取,在Deepin 20中归档管理器提示装入归档文件时出现了一个错误的原因...

    在升级到Deepin 20系统后,归档管理器(file-roller 3.30.2.1-1+dde)不能打开任何的zip文件,会提示错误信息:装入归档文件时出现了一个错误,如下图所示.以下是原因分析及 ...

  2. linux装入归档文件时出现了一个错误_Linux下解压tar.xz文件

    1.概述 安装MySQL时发现有些版本是以tar.xz文件进行压缩的,于是对它进行了一下了解,现将内容总结如下. 2.使用tar命令解压一览 首先说一下,tar是tape archive的全称,它预装 ...

  3. 装入归档文件时出现了一个错误

    使用 unzip xxx.zip提示如下: Archive: xxx.zip warning [xxx.zip]: 5696469980 extra bytes at beginning or wit ...

  4. linux装入归档文件时,装入归档文件时发生了错误!!怎么解决?

    我刚开始学linux 我装完一个redhat enterprise linux 5 进入桌面后我考进了几个.gz的压缩文件 然后我双击解压 系统总是跳出"装入归档文件时发生了错误!" ...

  5. steam买游戏显示服务器发生了错误,steam安装游戏时发生了一个错误是怎么回事?应该如何解决...

    steam在安装游戏时发生了一个错误(连接超时)是什么情况?安装steam游戏时发生了一个错误不知道怎么解决很头疼吧,其实,导致这个问题出现的原因百分之九十是因为网络原因所导致的问题,那么,出现这种情 ...

  6. c++定义一个动态全局变量_静态链接与动态链接的宏观概述及微观详解

    静态链接与动态链接的宏观概述及微观详解 第一部分 宏观概述 1. 静态链接 静态链接就是在程序运行前,链接器通过对象文件中包含的重定位表,完成所有重定位操作,并最终形成一个在运行时不需要再次进行依赖库 ...

  7. 记录谷歌gn编译时碰到的一个错误“I could not find a “.gn“ file ...”

    应用谷歌gn+nijia,在ubuntu7.9上编译程序时,碰到这么一个错误提示 # gn gen out/ "ERROR Can't find source root. I could n ...

  8. 安装该设备时去现一个错误,系统找不到指定的文件

    问题描述:安装USB设备时,安装设备时出现一个错误,系统找不到指定的文件. 问题处理:计算机出现上述错误,安装驱动后,出现上面的提示,点完成.又出现发现硬件信息,再安装又出现同样的错误,这样不停的出现 ...

  9. 内存的基础知识(常用数量单位、进程运行原理、存储单元、内存地址、绝对装入、静态重定位、动态重定位、静态链接、动态链接等)

    文章目录 前言 知识总览 什么是内存?有何作用? 几个常用的数量单位 进程的运行原理--指令 逻辑地址vs物理地址 进程运行的基本原理 装入模块装入内存 装入的三种方式 1.绝对装入 2.静态重定位 ...

最新文章

  1. LSD-SLAM解读——帧间追踪(详细推导)
  2. alert 回调_element之Alert 警告
  3. Cocos2d-x3.2 重力感应
  4. OllyDbg 使用笔记 (二)
  5. linux的nvme驱动需要关心的统计项
  6. 志翔科技用大数据技术为行业云构建“安全之翼”...
  7. 关于非对称加密算法在不同系统间对接时的使用要点
  8. Redis深入之道:原理解析、场景使用以及视频解读
  9. Javascript常用对象的属性和方法
  10. 机器学习- 吴恩达Andrew Ng - week3-1 Classification
  11. 分享几个实用的破解软件
  12. 您需要来自Administration的权限才能对此文件夹进行更改’怎么删除文件,window10删除2345流氓软件
  13. Python遥感开发之GDAL读写遥感影像
  14. [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  15. 竞赛获奖系统解读:远场说话人确认中基于两阶段迁移学习解决域不匹配问题
  16. android 应用被系统回收,莫往Applicaotion存缓存/app被系统回收之后再打开发生了什么...
  17. WorkFlow一:WorkFlow基础配置
  18. 字符串根据字节长度进行截取并展示选中效果——js字符串获取字节长度
  19. DDS的理解及IP核的使用
  20. Git永久删除历史文件(包含历史记录)

热门文章

  1. 机器学习Tensorflow基本操作:线程队列图像
  2. 在斯坦福,做 Manning 的 phd 要有多强?
  3. 跨性别,你所不知道的事
  4. 你的模型真的陷入局部最优点了吗?
  5. 谷歌发布端到端AI平台,还有用于视频和表格的AutoML、文档理解API等多款工具
  6. Githug第42关rebase_onto通关秘籍
  7. AlphaFold 和 AI 蛋白质折叠革命的下一步是什么
  8. AOP和Spring AOP介绍
  9. 201671030111 李蓉 实验十四 团队项目评审课程学习总结
  10. js 控制页面跳转的5种方法