范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

静态链接与动态链接(Linux)

  前言
  上一篇分享了静态链接与动态链接的实验(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笔记,如有错误,欢迎指出!

当经济衰退之时最近有一些数据,如果把它们放在一起比较的话就会非常有趣,所以我们就把它们放在一起讨论一下首先是面对这次疫情,从宏观经济角度看,各大经济部门在做什么?居民部门在疯狂的储蓄,存钱。比如养老金已经连续16年上涨了,但我劝你别高兴得太早!前不久,有关养老金的一条新闻上了热搜。5月12日,上海提高了养老金的领取额度,只要退休人员在2019年12月31日前完成退休手续,并且按月领取基本养老金的话,2020年领取的养老金房地产税要来了,对我们到底有什么影响?前天看到一个新闻,特朗普为了预防新冠肺炎在吃羟氯喹。全世界都在马不停蹄的研究疫苗。堂堂世界第一大国的领导人,竟然为了广大群众亲身试药,真是让人感激涕零。可这还没乐呵几分钟,我就看到有钱人越来越舍不得中国身份,海外留学和投资不香了?外媒最近对中国财富家庭的一系列采访发现,新冠肺炎疫情可能永久改变中国财富家庭送子女出国留学,以及利用投资工具移民海外的热情。对于中国城市的高净值人士来说,各种基于疫情的问题突然混合OLED终于被赶上?国内厂商研发首款LCD屏下解锁,网友永不为奴相信大家都知道,现在市面上的屏下指纹解锁都是OLED屏幕,但是很多人引以为豪的LCD屏幕的屏下指纹机却始终没能量产,各大厂商也在不断地追求新技术。而就在今天,天马微电子官宣了全球首2020年,读过137本书,读完65本,推荐这3本2017年6月26日,我从kindle转战微信读书。为此,特意换成超大屏幕的手机。我读书的目的有二满足好奇心,学习成长。上帝给我一个珍贵的礼物叫好奇心,读书是满足好奇心最好的方法。第二章初入市场撞到牛市(1)回到自己租的房子后,我整理了一下自己的思路,然后就跟我妈打了个电话。电话通了喂,妈,给我打点钱,我准备炒股,现在要有一波牛市要来了。其实我当时哪里知道有没有牛市要来,单纯就是仅仅想进军20万SUV市场,零跑C11创新技术强势起跑随着我国对新能源汽车基础设施的建设水平不断提升,消费者对购买新能源车型的热情也越来越高涨。和传统燃油车相比,新能源汽车在经济性上的优势非常明显,其使用便利性也越来越接近燃油车。但是比亚迪e3到底怎么样?如果你是对比亚迪e3感兴趣的童鞋,不妨接着往下看下去,这是一篇真实车主的用车感受,满满的干货!2020年初的新冠疫情,让我做出了一个重要决定买车,虽说一直都有买车的念头,但并不是特春日踏青,比亚迪e2统统搞定汽车当然不止是一辆代步工具,对大部分家庭来说,家中唯一的一辆爱车还要兼顾有自驾出游的功能。一场春日踏青,爱车解决了代步的烦恼还承载起了一家人的欢乐,沿途的所有它都统统为你搞定。今天复工保护的好伙伴比亚迪e2作为比亚迪e2车主来说,必须要称赞一句绝对的好伙伴!本次的主人公就是冲着比亚迪新能源车的实力来的,果然也没有让他失望,实力杠杠的e2表现如何,接着往下看吧!给大家介绍一下,这就是我
HDC华为开发者大会早鸟票售罄,正价票分四批开售华为HDC大会被称为开发者嘉年华每年的开发者大会上华为都会发布一系列的前沿科技,在19年20年的HDC上华为分别发布了鸿蒙1。0和2。0开发者版,在今年的HDC华为大概率会发布鸿蒙华为P50Pro时尚与实力兼具,为你捕捉最真实的色彩华为的品牌影响力想必大家都知道,它可以算得上是电子科技领域里面的标杆,每上市一款新品都备受关注。8月12日华为P50Pro正式开售,受到众多消费者的关注。下面我们就来一起看看华为P太有用,Alibaba架构师十年心血熬成的435网络协议文档前言为什么网络协议这么重要呢?集群规模一大,我们首先想到的就是网络互通的问题应用吞吐量压不上去,我们首先想到的也是网络互通的问题。所以,要成为技术牛人,搞定大系统,一定要过网络这一芜湖!用Java语言编写一个五子棋UI界面并实现网络对战功能使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)一,前期准备1,JavaIDE(Eclipse)与JDK的安装与配置jdk15。0。1免配置路径版提取码earu大厂也在用的6种数据脱敏方案,严防泄露数据的内鬼最近连着几天晚上在家总是接到一些奇奇怪怪的电话,哥,你是xxx吧,我们这里是xxx高端男士私人会所,握草,我先是一愣,然后狠狠的骂了回去。一脸傲娇的转过头,面带微笑稍显谄媚老婆你听阿里面试盲区JAVA编程环境与基本数据类型java的编程环境LinuxLubuntu下安装与使用Java!按下CtrlAltT打开命令终端安装Javasudoaptinstallopenjdk8jdk安装Java命令jav基于SpringCloud分布式的物联网平台源码免费分享需要获取本项目源码的同学,关注我,转发本文之后私信回复源码即可免费获取到!简介诞生于2006年,是一款以开源中立社区化发展起来的物联网操作系统。,浅显易懂,且具有方便移植的特性(可最全MyBatis中XML映射文件(Mapper)标签分析前言MyBatis的强大之处就在于它的映射器文件,而这也正是MyBatis的魔力所在,对于任何MyBatis的使用者来说,MyBatis的映射文件是必须要掌握的。Mapper文件标Akamai在Gartner关键能力报告的三个用例中斩获高分2021年10月19日负责保护和交付数字化体验且深受全球企业信赖的解决方案提供商阿卡迈技术公司(AkamaiTechnologies,Inc。,以下简称Akamai)(NASDAQ华为nova9Pro火爆热销中,展现何为以细节取胜毫无疑问,华为nova9系列对华为而言,是一次新的突破,发布后屡获好评也展现出了其不可替代的市场地位。究竟华为nova9系列有着怎样独特的魅力呢?这个问题激起了我的好奇心,带着问题获当红顶流关晓彤力捧,华为nova9系列手机圆你影像梦最近刷微博,不少当红UP主,甚至当红顶流关晓彤都不约而同地在推荐华为nova9系列手机,虽说早就知道nova系列手机的摄影摄像功能很强大。但也依旧被这热烈的推荐热潮给感染了,已经入