linux下c程序的链接、装载和库(3)
9. 目标文件放在一起-->静态库。
你的同事给出的目标文件太多了,从 one.o two.o …… …… 一直到 xxx.o。
好的,你如果真正想用,你的同事提供的这些现有的目标文件,你得做三件事:
一,查看自己的源文件,看看用到了哪些函数;
二,明确这些函数来自于哪个目标文件,本例中,很容易,因为函数的名字和目标文件的名字是对应的,比如one.o就会提供一个名称为one的函数;
三,使用 ld ,将你自己的目标文件和第二步中找到的那些目标文件链接起来,生成可执行文件。
第一步就是个很耗时的过程;
第二步其实也不简单,因为,你根本不能假设,函数的名字和目标文件的名字是对应的,本文只是举一个例子而已;
第三步嘛,也很麻烦,因为你要手动输入这些目标文件的名字,万一打错字怎么办?
所以,你的同事,将 one.o two.o …… …… 一直到 xxx.o 统一制作成一个文件,叫做 goodThings.a,这个 goodThings.a 就包含了所有的目标文件了。
你使用的时候,只需要这么做,假设你自己的目标文件叫做 main.o,
ld main.o goodThings.a -o go
简洁明了!一步成功! ld 这个命令会自动在 goodThings.a 中去查找 main.o 使用的目标文件,并链接起来。
好,正式介绍 goodThings.a 这个新“人物”。
这个东西就是静态库。(关于静态这个词,后面再讲)
说白了,就是目标文件的打包,放在一块而已。
ar 这个命令可以用来制作静态库:
ar -r goodThings.a one.o two.o three.o ………… xxx.o
这样就能把 one.o 一直到 xxx.o 放在 goodThings.a 里了。
你可以查看一个静态库文件里有哪些目标文件:
ar -t goodThings.a
不过,建议将静态库的名字叫成 libxxx.a 这样的格式,这样更符合命名规范,实际上是,这样的命名规范是有好处的。因为可以这样用:
ld main.o -L . -lxxx -o go
ld 会在本目录下去找 libxxx.a。当然,这里假设,你把 libxxx.a 放在本目录了。其中 -L . 就是说,在本目录下去找的意思。
10. 静态到动态。
前面说到了装载的概念,就是把程序从硬盘搬到内存去,从而开始执行。
可以简单的说:
静态:链接过程在装载之前已经完成。
动态:等到装载的时候再去找相应的库文件,进而链接。
关于静态,一劳永逸,所有的东西都在这里了,想什么时候执行就什么时候执行。
动态呢,不是这样,执行的时候,去找我需要什么,再链接,再装载。
讨论一下动态的好处。
举一个例子,看电视。
小明和小强都要看电视,于是他们一人背着一个电视,似乎,有点累。
小明说,把电视放到房间里吧,嗯,于是,他俩在一个房间里,打开两个电视,都在看一个台,似乎,有点浪费。
小明说,既然看一个台,那关一台,似乎,这样很好。
假如小明和小强同时用到了 one.o ,那么可以推出一个结果,小明和小强的 可执行文件里,一定都包含这个 one.o。
第一,浪费硬盘空间;(两份可执行文件都包含了 one.o )
第二,程序装载时,浪费内存。(因为 one.o 被装载了两次)
动态库,就可以解决以上两个问题。
同样的代码,硬盘上应该可以只存在一份,内存中也应该只存在一份,以达到节省的效果。
这就是为什么,动态链接,是在程序被装载的时候,才去链接。(因为早链接了,不就占硬盘空间了么)
这就是为什么,动态链接,可以节省内存。(因为相同的库,我只链接一次,放在内存里,第二份可执行文件依然可以共享这个库)
linux下c程序的链接、装载和库(3)的更多相关文章
- linux下c程序的链接、装载和库(1)
读完<程序员的自我修养--链接.装载和库>相关章节,想来总结一下,若有错误,请指正,多谢. 1. 什么叫目标文件? 你的工程里有很多xxx.c这样的源文件,这些文件是文本文件,只有人能够认 ...
- Linux下进行程序设计时,关于库的使用:
一.gcc/g++命令中关于库的参数: -shared: 该选项指定生成动态连接库: -fPIC:表示编译为位置独立(地址无关)的代码,不用此选项的话,编译后的代码是位置相关的,所以动态载入时,是通过 ...
- linux下c程序的链接、装载和库(2)
5. 重定义错误. 一个最终的可执行文件里,绝对不允许出现两个同名的全局变量,也不允许出现同名的全局函数. 全局函数:只要不用 static 修饰符修饰的函数,全部都是全局的. 全局变量:函数外声明定 ...
- Linux下C程序的编辑,编译和运行以及调试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- linux下软、硬链接的创建和删除
linux下软.硬链接的创建和删除 在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复 ...
- Linux下显示运行时链接(运行时加载)
目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dler ...
- linux下c程序调用reboot函数实现直接重启【转】
转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html linux下c程序调用reboot函数实现直接重启 当然你也可以直接调用syst ...
- 位图文件(BMP)格式以及Linux下C程序实现(转)
源:位图文件(BMP)格式以及Linux下C程序实现 说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图 ...
- Linux下C程序内存泄露检测
在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在lin ...
随机推荐
- R in Action 读书笔记(5)
MindMapper原文件
- hibernate用注解替代映射文件
1.首先把原来的映射文件删掉,给实体类添加注解: @Entity //声明当前类为hibernate映射到数据库中的实体类 @Table(name="news") //声明tabl ...
- java IO流 之 字节流
一.file类的常用操作 File file=new File("E:\\test\\javaIo"); System.out.println(file.isDirectory() ...
- MongoDB 安装和可视化工具
MongoDB 是一款非常热门的NoSQL,面向文档的数据库管理系统,官方下载地址是:MongoDB,博主选择的是 Enterprise Server (MongoDB 3.2.9)版本,安装在Win ...
- distribution 中一直在运行 waitfor delay @strdelaytime 语句
Replication 自动创建来一个 Job:Replication monitoring refresher for distribution,这个Agent执行一个sp: dbo.sp_repl ...
- 通知:逆天异常库 V1.0版本支持下载了~~
百度网盘:http://pan.baidu.com/s/1bongheJ GitHub:https://github.com/dunitian/LoTDotNet
- 有吧友需要PDF的下载站点,好吧,我这边汇总一下
[经验]谈谈怎么找自己想要的资源吧~ http://www.cnblogs.com/dunitian/p/4715482.html PDF Free Computer, Programming, Ma ...
- 《JS设计模式笔记》 1,单例模式
<script type="text/javascript"> //单例模式 //1,每次点击都会生成一个新的div var createMask=function ( ...
- 前端学PHP之函数
× 目录 [1]函数定义 [2]函数参数[3]返回值[4]变量函数[5]回调函数[6]递归函数[7]加载函数[8]匿名函数 前面的话 PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数 ...
- 分享几个.NET WinForm开源组件,纪念逐渐远去的WinForm。。。
前面3个月的时间内,这些.NET开源项目你知道吗?系列文章已经发表了3篇,共计45个平时接触比较少,曾经默默无闻的.NET开源项目,展示给大家,当然不是每个人都能用得上,但也的确是有些人用了,反响还不 ...