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