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)的更多相关文章

  1. linux下c程序的链接、装载和库(1)

    读完<程序员的自我修养--链接.装载和库>相关章节,想来总结一下,若有错误,请指正,多谢. 1. 什么叫目标文件? 你的工程里有很多xxx.c这样的源文件,这些文件是文本文件,只有人能够认 ...

  2. Linux下进行程序设计时,关于库的使用:

    一.gcc/g++命令中关于库的参数: -shared: 该选项指定生成动态连接库: -fPIC:表示编译为位置独立(地址无关)的代码,不用此选项的话,编译后的代码是位置相关的,所以动态载入时,是通过 ...

  3. linux下c程序的链接、装载和库(2)

    5. 重定义错误. 一个最终的可执行文件里,绝对不允许出现两个同名的全局变量,也不允许出现同名的全局函数. 全局函数:只要不用 static 修饰符修饰的函数,全部都是全局的. 全局变量:函数外声明定 ...

  4. Linux下C程序的编辑,编译和运行以及调试

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  5. linux下软、硬链接的创建和删除

    linux下软.硬链接的创建和删除 在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复 ...

  6. Linux下显示运行时链接(运行时加载)

    目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dler ...

  7. linux下c程序调用reboot函数实现直接重启【转】

    转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html linux下c程序调用reboot函数实现直接重启 当然你也可以直接调用syst ...

  8. 位图文件(BMP)格式以及Linux下C程序实现(转)

    源:位图文件(BMP)格式以及Linux下C程序实现 说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图 ...

  9. Linux下C程序内存泄露检测

    在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在lin ...

随机推荐

  1. 抛开flash,自己开发实现C++ RTMP直播流播放器

    抛开flash,自己开发实现C++ RTMP直播流播放器 众所周知,RTMP是以flash为客户端播放器的直播协议,主要应用在B/S形式的场景中.本人研究并用C++开发实现了RTMP直播流协议的播放器 ...

  2. Zookeeper API for JAVA实战与应用

    package com.zookeeper.watcher; import java.util.List; import java.util.concurrent.CountDownLatch; im ...

  3. Node.js教程系列~目录

    Node.js这个东西在近几年火起来了,而且会一直火下去,无论在infoq还是在cnblogs,csdn上,都可以到处看到它的样子,它主推的应该就是异步式I/O 吧,是的,设计的很完美,很吸引人,虽然 ...

  4. Wakatime 测试工作时间

    Wakatime – 现在几点了,你在做什么呢 前面提到了一个用来QS自己的工具Clarify.这次介绍一个专门给程序员用的工具.大家都知道一万小时定律,但我究竟写java写了多久了呢?WakaTim ...

  5. CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  6. HTML5入门以及新标签

    HTML5 学习总结(一)--HTML5入门与新增标签   目录 一.HTML5概要 1.1.为什么需要HTML5 1.2.什么是HTML5 1.3.HTML5现状及浏览器支持 1.4.HTML5特性 ...

  7. Ado net Source 用法

    Ado net Source 是用于获取数据源的,使用的connection manager是 ado net connection. Ado Net Source 的Data Access Mode ...

  8. 前端学PHP之函数

    × 目录 [1]函数定义 [2]函数参数[3]返回值[4]变量函数[5]回调函数[6]递归函数[7]加载函数[8]匿名函数 前面的话 PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数 ...

  9. 深入理解脚本化CSS系列第四篇——脚本化样式表

    × 目录 [1]CSSStyleSheet [2]CSSRule 前面的话 关于脚本化CSS,查询样式时,查询的是计算样式:设置单个样式时,设置的是行间样式:设置多个样式时,设置的是CSS类名.脚本化 ...

  10. 应用程序框架实战十三:DDD分层架构之我见

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...