快捷搜索:   nginx

全力打造Make程式和重新编译核心技术

Make通常用来维护程式,使可执行档的内容保持和原始程式的一致性,因其依循唯有变动才需重新编译连结的方式,由各档之间的「依存关系」自动去编译连结,如此可省下了宝贵的时间和系统资源。在Linux中最普遍的例子应是核心(kernel)的重 编,当读者把gcc等程式和核心原始程式安装完後(Slackware中为D套件,SLS中为C和 S套件),便可依实际情况去更新或置换核心的内容。核心是由许多不同的部份所组成 ,如行程的管理、档案系统的支援、周边配备的驱动程式、网路通讯的协定等,当组 成的部分有所更新或是不需要时,就需要重编核心,以便产生符合真实环境的核心程 式,使得PC能得到最佳的利用。如没有SCSI卡的PC便不需要SCSI的驱动程式,而且可 依光碟和音效卡的种类更换不同的驱动程式。如此繁琐的过程,在make的帮助下,可 以作得又快又好,只需透过一连串的选择,其馀就完全交给make去负责,真是省事又 方便。和核心编译有关的细节我们稍後再共同研讨。make的最初目的是帮助程式设计 师作为编译连结时的管理,因此我们先来看看make的用法。

  使用时机和环境

  当程式写作或是更新後,编连的步骤便是使用make的最好时机。在Linux中,启 动make只消打make便可,make会先去找同目录下的Makefile或是makefile,若找不到 便出现make的参数使用方法。makefile是一个文书档,可用vi或是jed编辑,它可说 是make的script,make就完全依此档的内容来动作。在这个档中,记录了档案的产生 方法、相关性质和一些变数等。在这个档中,凡是以#为开头者,整行都视为注解, 和shell的script

  file是相同的。makefile中约略可分成变数区和指令区两部分, 纵贯档案的有依存、字尾等规则,共同构成makefile的语法。

  Makefile中的变数

  在makefile中可将一字串设定给一变数,需要时可如shell的script

  file展开 ,因此也可称为巨集(marco),变数设定的方式为:

  变数名称=设定值

  除了某些特殊符号外(如#、:、;、=、空白、定位字元、新列字元),其馀都可作 为设定值的内容。一般来说,最好使用英数字,以避免发生不可预料的错误,以下是 一些合法的设定

  SOURCE = test1.c test2.c test3.c

  OBJ = main.o

  当要取用(展开)变数时,只需用()将变数括起来,前头加上$符号即可,如$(OBJ) 这个变数,当make执行至此时,将视为main.o。

  依存关系

  make的主要工作方式,是依「依存关系」(dependency)来工作的,而所谓的依存关系,就是指两或多个档案间彼此的关系,譬如我们写了一个test.c程式,当我们 编译如下时:

  $ gcc -O -o test test.c

  便会产生test.o这个目的档,因此test.o便是依於test.c,当test.c改变时, test.o也需重新编译,才能保持程式的最新版本;若test.o是由test1.c和test2.c 所组成的,那test.o同时依存於test1.c及test2.c,依存关系便是相关档案的先後关系,和档案的「生成」方式,如C语言的原始档.c需cc或gcc作编译後才能生成目标档 .o,而且make功能强大,在依存规则中并不限定只能作和编译有关的动作。

  接下来就是将依存规则写入makefile中了,依存规则的格式如下:

  目标档;依存档;命令

  「目标档」就是「依存档」照「命令」的方式造出的档案,如上例便可写成:

  test:test.c;gcc -O -o test test.c

  或是可将「命令」写在下一行,但是需有定位字元作为前导,因此可写成:

  test:test.c

  gcc -O -o test test.c

  通常以此方式撰写,认为是较好的方式;若「目标档」或「依存档」中有两个以 上的档案,各档案名称间以空白隔开便可,如下:
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论