⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000003.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;alanxzj&nbsp;(天浪),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;Make程式和重编核心&nbsp;&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Thu&nbsp;Sep&nbsp;14&nbsp;03:16:31&nbsp;2000)&nbsp;<BR>&nbsp;<BR>Make通常用来维护程式,使可执行档的内容保持和原始程式的一致性,因其依循唯&nbsp;<BR>有变动才需重新编译连结的方式,由各档之间的「依存关系」自动去编译连结,如&nbsp;<BR>此可省下了宝贵的时间和系统资源。在Linux中最普遍的例子应是核心(kernel)的&nbsp;<BR>重&nbsp;编,当读者把gcc等程式和核心原始程式安装完後(Slackware中为D套件,SLS中&nbsp;<BR>为C和&nbsp;S套件),便可依实际情况去更新或置换核心的内容。核心是由许多不同的部&nbsp;<BR>份所组成&nbsp;,如行程的管理、档案系统的支援、周边配备的驱动程式、网路通讯的&nbsp;<BR>协定等,当组&nbsp;成的部分有所更新或是不需要时,就需要重编核心,以便产生符合&nbsp;<BR>真实环境的核心程&nbsp;式,使得PC能得到最佳的利用。如没有SCSI卡的PC便不需要&nbsp;<BR>SCSI的驱动程式,而且可&nbsp;依光碟和音效卡的种类更换不同的驱动程式。如此繁琐&nbsp;<BR>的过程,在make的帮助下,可&nbsp;以作得又快又好,只需透过一连串的选择,其馀就&nbsp;<BR>完全交给make去负责,真是省事又&nbsp;方便。和核心编译有关的细节我们稍後再共同&nbsp;<BR>研讨。make的最初目的是帮助程式设计&nbsp;师作为编译连结时的管理,因此我们先来&nbsp;<BR>看看make的用法。&nbsp;&nbsp;<BR>&nbsp;<BR>使用时机和环境&nbsp;&nbsp;<BR>  当程式写作或是更新後,编连的步骤便是使用make的最好时机。在Linux中,&nbsp;<BR>启&nbsp;动make只消打make便可,make会先去找同目录下的Makefile或是makefile,若&nbsp;<BR>找不到&nbsp;便出现make的参数使用方法。makefile是一个文书档,可用vi或是jed编辑&nbsp;<BR>,它可说&nbsp;是make的script,make就完全依此档的内容来动作。在这个档中,记录&nbsp;<BR>了档案的产生&nbsp;方法、相关性质和一些变数等。在这个档中,凡是以#为开头者,整&nbsp;<BR>行都视为注解,&nbsp;和shell的script file是相同的。makefile中约略可分成变数区&nbsp;<BR>和指令区两部分,&nbsp;纵贯档案的有依存、字尾等规则,共同构成makefile的语法。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;<BR>Makefile中的变数&nbsp;&nbsp;<BR>  在makefile中可将一字串设定给一变数,需要时可如shell的script file展&nbsp;<BR>开&nbsp;,因此也可称为巨集(marco),变数设定的方式为:&nbsp;&nbsp;<BR>&nbsp;<BR>  变数名称=设定值&nbsp;&nbsp;<BR>&nbsp;<BR>  除了某些特殊符号外(如#、:、;、=、空白、定位字元、新列字元),其馀都可&nbsp;<BR>作&nbsp;为设定值的内容。一般来说,最好使用英数字,以避免发生不可预料的错误,&nbsp;<BR>以下是&nbsp;一些合法的设定&nbsp;&nbsp;<BR>&nbsp;<BR>  SOURCE&nbsp;=&nbsp;test1.c&nbsp;test2.c&nbsp;test3.c&nbsp;&nbsp;<BR>  OBJ&nbsp;=&nbsp;main.o&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>  当要取用(展开)变数时,只需用()将变数括起来,前头加上$符号即可,如&nbsp;<BR>$(OBJ)&nbsp;这个变数,当make执行至此时,将视为main.o。&nbsp;&nbsp;<BR>&nbsp;<BR>  &nbsp;&nbsp;<BR>&nbsp;<BR>依存关系&nbsp;&nbsp;<BR>  make的主要工作方式,是依「依存关系」(dependency)来工作的,而所谓的&nbsp;<BR>依存关系,就是指两或多个档案间彼此的关系,譬如我们写了一个test.c程式,当&nbsp;<BR>我们&nbsp;编译如下时:&nbsp;&nbsp;<BR>&nbsp;<BR>  $&nbsp;gcc&nbsp;-O&nbsp;-o&nbsp;test&nbsp;test.c&nbsp;&nbsp;<BR>&nbsp;<BR>  便会产生test.o这个目的档,因此test.o便是依於test.c,当test.c改变时,&nbsp;<BR>&nbsp;test.o也需重新编译,才能保持程式的最新版本;若test.o是由test1.c和&nbsp;<BR>test2.c&nbsp;所组成的,那test.o同时依存於test1.c及test2.c,依存关系便是相关档&nbsp;<BR>案的先後关系,和档案的「生成」方式,如C语言的原始档.c需cc或gcc作编译後才&nbsp;<BR>能生成目标档&nbsp;.o,而且make功能强大,在依存规则中并不限定只能作和编译有关&nbsp;<BR>的动作。&nbsp;&nbsp;<BR>&nbsp;<BR>  接下来就是将依存规则写入makefile中了,依存规则的格式如下:&nbsp;&nbsp;<BR>&nbsp;<BR>  目标档;依存档;命令&nbsp;&nbsp;<BR>&nbsp;<BR>  「目标档」就是「依存档」照「命令」的方式造出的档案,如上例便可写成:&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;<BR>  test:test.c;gcc&nbsp;-O&nbsp;-o&nbsp;test&nbsp;test.c&nbsp;&nbsp;<BR>&nbsp;<BR>  或是可将「命令」写在下一行,但是需有定位字元作为前导,因此可写成:&nbsp;&nbsp;<BR>&nbsp;<BR>  test:test.c&nbsp;&nbsp;<BR>     gcc&nbsp;-O&nbsp;-o&nbsp;test&nbsp;test.c&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>  通常以此方式撰写,认为是较好的方式;若「目标档」或「依存档」中有两个&nbsp;<BR>以&nbsp;上的档案,各档案名称间以空白隔开便可,如下:&nbsp;&nbsp;<BR>&nbsp;<BR>  test:test1.c&nbsp;test2.c&nbsp;&nbsp;<BR>     gcc&nbsp;-O&nbsp;-o&nbsp;test&nbsp;test1.c&nbsp;test.c&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>  如此定下规则,那天若是test1.c或test2.c有修改时(日期会比test.o还新)&nbsp;&nbsp;<BR>,&nbsp;make便会重新编译,若是test.o为最晚者,那就没有执行命令的必要了。&nbsp;&nbsp;<BR>&nbsp;<BR>  接下来我们先看范例一:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>范例一:&nbsp;&nbsp;<BR>&nbsp;<BR>01&nbsp;#&nbsp;&nbsp;<BR>02&nbsp;#&nbsp;Makefile&nbsp;for&nbsp;cshow&nbsp;&nbsp;<BR>03&nbsp;#&nbsp;By&nbsp;Ivor&nbsp;Chen&nbsp;&nbsp;<BR>04&nbsp;#&nbsp;08/31/1994&nbsp;&nbsp;<BR>05&nbsp;#&nbsp;&nbsp;<BR>06&nbsp;&nbsp;<BR>07&nbsp;CC&nbsp;=&nbsp;gcc&nbsp;&nbsp;<BR>08&nbsp;OPTIMIZE&nbsp;=&nbsp;-fomit-frame-pointer&nbsp;-O2&nbsp;-s&nbsp;&nbsp;<BR>09&nbsp;CFLAGS&nbsp;=&nbsp;$(DEFINES)&nbsp;$(OPTIMIZE)&nbsp;&nbsp;<BR>10&nbsp;LFLAGS&nbsp;=&nbsp;-N&nbsp;&nbsp;<BR>11&nbsp;&nbsp;<BR>12&nbsp;PROGS&nbsp;=&nbsp;cshow&nbsp;&nbsp;<BR>13&nbsp;PROGS_O&nbsp;=&nbsp;cshow.o&nbsp;&nbsp;<BR>14&nbsp;LIBS&nbsp;=&nbsp;-lvgagl&nbsp;-lvga&nbsp;&nbsp;<BR>15&nbsp;&nbsp;<BR>16&nbsp;all:&nbsp;progs&nbsp;&nbsp;<BR>17&nbsp;&nbsp;<BR>18&nbsp;progs:&nbsp;$(PROGS)&nbsp;&nbsp;<BR>19&nbsp;&nbsp;<BR>20&nbsp;objs:&nbsp;$(PROGS_O)&nbsp;&nbsp;<BR>21&nbsp;&nbsp;<BR>22&nbsp;.c.o:&nbsp;&nbsp;<BR>23&nbsp;$(CC)&nbsp;$(CFLAGS)&nbsp;-c&nbsp;-o&nbsp;$*.o&nbsp;$&lt;&nbsp;&nbsp;<BR>24&nbsp;&nbsp;<BR>25&nbsp;.c.s:&nbsp;&nbsp;<BR>26&nbsp;$(CC)&nbsp;$(CFLAGS)&nbsp;S&nbsp;o&nbsp;$*.s&nbsp;$&lt;&nbsp;&nbsp;<BR>27&nbsp;&nbsp;<BR>28&nbsp;.o:&nbsp;&nbsp;<BR>29&nbsp;$(CC)&nbsp;$(CFLAGS)&nbsp;$(LFLAGS)&nbsp;o&nbsp;$*&nbsp;$*.o&nbsp;$(LIBS)&nbsp;&nbsp;<BR>30&nbsp;chmod&nbsp;a+rs,go-w&nbsp;$*&nbsp;&nbsp;<BR>31&nbsp;&nbsp;<BR>32&nbsp;clean&nbsp;:&nbsp;cleanbin&nbsp;&nbsp;<BR>33&nbsp;rm&nbsp;f&nbsp;*.o&nbsp;*~&nbsp;&nbsp;<BR>34&nbsp;&nbsp;<BR>35&nbsp;cleanbin&nbsp;:&nbsp;&nbsp;<BR>36&nbsp;rm&nbsp;f&nbsp;$(PROGS)&nbsp;&nbsp;<BR>37&nbsp;&nbsp;<BR>38&nbsp;dep&nbsp;:&nbsp;&nbsp;<BR>39&nbsp;rm&nbsp;f&nbsp;.depend&nbsp;&nbsp;<BR>40&nbsp;make&nbsp;.depend&nbsp;&nbsp;<BR>41&nbsp;&nbsp;<BR>42&nbsp;.depend:&nbsp;&nbsp;<BR>43&nbsp;echo&nbsp;#&nbsp;Program&nbsp;dependencies&gt;.depend&nbsp;&nbsp;<BR>44&nbsp;gcc&nbsp;-MM&nbsp;$(patsubst&nbsp;%.o,%.c,$(PROGS_O))&nbsp;&gt;&gt;.depend&nbsp;&nbsp;<BR>45&nbsp;&nbsp;<BR>46&nbsp;include&nbsp;.depend&nbsp;&nbsp;<BR>&nbsp;<BR>  范例一是笔者的cshow程式的makefile,其中01至05行以#开头作为注解用;&nbsp;<BR>07至&nbsp;14行是设定变数,其中07-10所设定的是有关编译器及其命令,11至14行则设&nbsp;<BR>定被编&nbsp;译的档案名称及额外需被连结的程式库名称;第16行便是一个依存规则,&nbsp;<BR>若是我们在&nbsp;命令列下只打make,那make便会去寻找makefile中的第一个规则来工&nbsp;<BR>作,在此这便是&nbsp;第一个规则,但这个规则比较特殊:一、本规则并无「命令」,&nbsp;<BR>二、本规则中的all&nbsp;并不是档名,而且其後的progs是下一条规则(第18行)的「目&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -