嵌入式Linux期末复习.doc

上传人:飞****2 文档编号:60116702 上传时间:2022-11-13 格式:DOC 页数:32 大小:948.50KB
返回 下载 相关 举报
嵌入式Linux期末复习.doc_第1页
第1页 / 共32页
嵌入式Linux期末复习.doc_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《嵌入式Linux期末复习.doc》由会员分享,可在线阅读,更多相关《嵌入式Linux期末复习.doc(32页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、P8 文件属性Linux 中的文件属性如图1.6 如示。首先,Linux 中文件的拥有者可以把文件的访问属性设成3 种不同的访问权限:可读(r)、可写(w)和可执行(x)。文件又有3个不同的用户级别:文件拥有者(u)、所属的用户组(g)和系统里的其他用户(o)。第一个字符显示文件的类型。n “-”表示普通文件。n “d”表示目录文件。n “l”表示链接文件。n “c”表示字符设备。n “b”表示块设备。n “p”表示命名管道,比如FIFO 文件(First In First Out,先进先出)。n “f”表示堆栈文件,比如LIFO 文件(Last In First Out,后进先出)。n “s

2、”表示套接字。第一个字符之后有三个三位字符组:n 第一个三位字符组表示文件拥有者(u)对该文件的权限。n 第二个三位字符组表示文件用户组(g)对该文件的权限。n 第三个三位字符组表示系统其他用户(o)对该文件的权限。n 若该用户组对此没有权限,一般显示“-”字符。目录权限和文件权限有一定的区别。对于目录而言,r 代表允许列出该目录下的文件和子目录,w代表允许生成和删除该目录下的文件,x代表允许访问该目录P14 用户切换(su)(1)作用。变更为其他使用者的身份,主要用于将普通用户身份转变为超级用户,而且需输入相应用户密码。(2)格式。su 选项 使用者其中的使用者为要变更的对应使用者。(3)常

3、见参数。主要选项参数如表2.1 su命令常见参数列表选项参数含义-,-l,-login为该使用者重新登录,大部分环境变量(如HOME、SHELL 和USER 等)和工作目录都是以该使用者(USER)为主。若没有指定USER,缺省情况是root-m,-p执行su时不改变环境变量-c,-command变更账号为USER的使用者,执行指令(command)后再变回原来使用者(4)使用示例。davidlocalhost $ su - rootPassword:rootlocalhost #示例通过su命令将普通用户变更为root 用户,并使用选项“-”携带root环境变量。(5)使用说明。n 在将普通

4、用户变更为root 用户时建议使用“-”选项,这样可以将root 的环境变量和工作目录同时带入,否则在以后的使用中可能会由于环境变量的原因而出错。n 在转变为root权限后,提示符变为#。P15 用户管理(useradd和passwd)(1)作用。 useradd:添加用户账号。 passwd:更改对应用户的账号密码。(2)格式。 useradd:useradd 选项 用户名。 passwd:passwd 选项 用户名。其中的用户名为修改账号密码的用户,若不带用户名,缺省为更改当前使用者的密码。(3)常用参数 useradd主要选项参数如表2.3 所示。useradd命令常见参数列表选项参数含

5、义-g指定用户所属的群组-m自动建立用户的登入目录-n取消建立以用户名称为名的群组 passwd:一般很少使用选项参数。(4)使用实例。rootlocalhost # useradd davidrootlocalhost # passwd davidNew password: (输入密码)Retype new password: (再输入一次密码,以确认输入的正确性)passwd: all authentication tokens updated successfullyrootlocalhost # su daviddavidlocalhost $davidlocalhost $ pwd(

6、查看当前目录)/home/david (该用户的工作目录)实例中先添加了用户名为david的用户,接着又为该用户设置了账号密码。从su的命令可以看出,该用户添加成功,其工作目录为“/home/david”。(5)使用说明。n 在添加用户时,这两个命令是一起使用的,其中,useradd 必须用root 的权限。而且useradd指令所建立的账号,实际上是保存在“/etc/passwd”文本文件中,文件中每一行包含一个账号信息。n 在缺省情况下,useradd所做的初始化操作包括在“/home”目录下为对应账号建立一个同名的主目录,并且还为该用户单独建立一个与用户名同名的组。n adduser 只

7、是useradd 的符号链接(关于符号链接的概念在本节后面会有介绍),两者是相同的。n passwd还可用于普通用户修改账号密码,Linux 并不采用类似Windows 的密码回显(显示为*号),所以输入的这些字符用户是看不见的。密码最好包括字母、数字和特殊符号,并且设成6 位以上。P17 系统管理命令(ps 和kill)(1)作用。 ps:显示当前系统中由该用户运行的进程列表。 kill:输出特定的信号给指定PID(进程号)的进程,并根据该信号完成指定的行为。其中可能的信号有进程挂起、进程等待、进程终止等。(2)格式。 ps:ps 选项。 kill:kill 选项 进程号(PID)。kill

8、 命令中的进程号为信号输出的指定进程的进程号,当选项是缺省时为输出终止信号给该进程。(3)常见参数。 ps 主要选项参数如表2.5 所示。 ps命令常见参数列表选项参数含义-ef查看所有进程及其PID(进程号)、系统时间、命令详细目录、执行者等-aux除可显示-ef所有内容外,还可显示CPU及内存占用率、进程状态-w显示加宽并且可以显示较多的信息 kill主要选项参数如表2.6 所示。kill命令常见参数列表选项参数含义-s将指定信号发送给进程-p打印出进程号(PID),但并不送出信号-l列出所有可用的信号名称(4)使用实例。rootlocalhost root# ps efUID PID P

9、PID C STIME TTY TIME CMDroot 1 0 0 2005 ? 00:00:05 initroot 2 1 0 2005 ? 00:00:00 keventdroot 3 0 0 2005 ? 00:00:00 ksoftirqd_CPU0root 4 0 0 2005 ? 00:00:00 ksoftirqd_CPU1root 7421 1 0 2005 ? 00:00:00 /usr/local/bin/ntpd c /etc/ntp.root 21787 21739 0 17:16 pts/1 00:00:00 grep ntprootlocalhost root#

10、kill -9 7421 (杀死进程)rootlocalhost root# ps -ef|grep ntproot 21789 21739 0 17:16 pts/1 00:00:00 grep ntp该实例中首先查看所有进程,并终止进程号为7421的ntp进程,之后再次查看时已经没有该进程号的进程。(5)使用说明。n ps在使用中通常可以与其他一些命令结合起来使用,主要作用是提高效率。n ps 选项中的参数w 可以写多次,通常最多写3 次,它的含义为加宽3 次,这足以显示很长的命令行了。例如:ps auxwww。P19 文件系统挂载命令(mount)(1)作用。挂载文件系统,它的使用权限是

11、超级用户或/etc/fstab中允许的使用者。正如1.2.1节中所述,挂载是指在分区和目录之间建立映射关系的过程,而挂载点是指挂载在文件树中的位置。使用mount命令可以把文件系统挂载到相应的目录下,并且由于Linux中把设备都当成文件一样使用,因此,mount命令也可以挂载不同的设备。通常,在Linux 下“/mnt”目录是专门用于挂载不同的文件系统的,它可以在该目录下新建不同的子目录来挂载不同的设备文件系统。(2)格式。mount 选项 类型 设备文件名 挂载点目录其中的类型是指设备文件的类型。(3)常见参数mount常见参数如表2.8所示。 mount命令选项常见参数列表选项参数含义-a

12、依照/etc/fstab的内容装载所有相关的硬盘-l列出当前已挂载的设备、文件系统名称和挂载点-t 类型将后面的设备以指定类型的文件格式装载到挂载点上。常见的类型有前面介绍过的几种:vfat、ext3、ext2、iso9660、nfs等-f通常用于除错。它会使mount不执行实际挂上的动作,而是模拟整个挂上的过程,通常会和-v一起使用(4)使用实例。使用mount命令主要通过以下几个步骤。 确认是否为Linux 可以识别的文件系统,Linux 可识别的文件系统只要是以下几种。n Windows 95/98常用的FAT32 文件系统:vfat。n WindowsNT/2000 的文件系统:ntf

13、s。n OS/2 用的文件系统:hpfs。n Linux 用的文件系统:ext2、ext3、nfs。n CD-ROM光盘用的文件系统:iso9660。 确定设备的名称,可通过使用命令“fdisk -l”查看。 查找挂载点。必须确定挂载点已经存在,也就是在“/mnt”下的相应子目录已经存在,一般建议在“/mnt”下新建几个如“/mnt/windows”,“/mnt/usb”的子目录,现在有些新版本的Linux(如Fedora、Ubuntu、红旗Linux、中软Linux、MandrakeLinux)都可自动挂载文件系统,Red Hat Linux 仅可自动挂载光驱。 挂载文件系统如下所示。roo

14、tlocaohost # mkdir -p /mnt/win/crootlocaohost # mount -t vfat /dev/hda1 /mnt/win/crootlocalhost # cd /mnt/win/c24.s03e01.pdtv.xvid-sfm.rmvb Documents and Settings Program Files24.s03e02.pdtv.xvid-sfm.rmvb Downloads RecycledC 盘是原先笔者Windows 系统的启动盘。可见,在挂载了C 盘之后,可直接访问Windows下的C盘的内容。 在使用完该设备文件后可使用命令umoun

15、t 将其卸载。rootlocalhost # umount /mnt/win/crootlocalhost # cd /mnt/win/crootlocalhost # ls /mnt/win/c可见,此时目录“/mnt/win/c”下为空。Windows下的C盘已被成功卸载。P21 cd和ls1cd(1)作用。改变当前工作目录。(2)格式。cd 路径其中的路径为要改变的工作目录,可为相对路径或绝对路径。(3)使用实例。rootlocalhost # cd /home/david/rootlocalhost david# pwdrootlocalhost david# /home/david/

16、该实例中变更工作目录为“/home/david/”,在后面的“pwd”(显示当前目录)的结果中可以看出。(4)使用说明。n 该命令将当前目录改变至指定路径的目录。若没有指定路径,则回到用户的主目录(例如:“/home/david”为用户david 的主目录)。为了改变到指定目录,用户必须拥有对指定目录的执行和读权限。n 该命令可以使用通配符。n 使用“cd ”可以回到前次工作目录。n “./”代表当前目录,“./”代表上级目录。2ls(1)作用列出目录和文件的信息。(2)格式。ls 选项 文件其中文件选项为指定查看指定文件的相关内容,若未指定文件,默认查看当前目录下的所有文件。(3)常见参数。

17、ls主要选项参数见表2.9所示。 ls命令常见参数列表选项参数含义-1,-format=single-column一行输出一个文件(单列输出)-a,-all列出目录中所有文件,包括以“.”开头的隐藏文件-d将目录名和其他文件一样列出,而不是列出目录的内容-l,-format=long,-format=verbose除每个文件名外,增加显示文件类型、权限、硬链接数、所有者名、组名、大小(Byte)及时间信息(如未指明是其他时间即指修改时间)-f不排序目录内容,按它们在磁盘上存储的顺序列出(4)使用实例。davidlocalhost test$ ls -ltotal 220drwxr-xr-x 2

18、 root root 4096 Mar 31 2005 bindrwxr-xr-x 3 root root 4096 Apr 3 2005 boot-rw-r-r- 1 root root 0 Apr 24 2002 test.run该实例查看当前目录下的所有文件,并通过选项“-l”显示出详细信息。显示格式说明如下。文件类型与权限 链接数 文件属主 文件属组 文件大小 修改的时间 名字(5)使用说明。n 在ls 的常见参数中,-l(长文件名显示格式)的选项是最为常见的。可以详细显示出各种信息。n 若想显示出所有“.”开头的隐藏文件,可以使用-a,这在嵌入式开发中很常用。P23 cat(1)作用

19、。连接并显示指定的一个或多个文件的有关信息。(2)格式。cat选项文件1 文件2其中的文件1、文件2 为要显示的多个文件。(3)常见参数。cat命令的常见参数如表2.11 所示。 cat命令常见参数列表选项参数含义-n由第一行开始对所有输出的行数编号-b和-n相似,只不过对于空白行不编号(4)使用实例。davidlocalhost $ cat -n hello1.c hello2.c1 #include 2 void main()3 4 printf(Hello!This is my home!n);5 6 #include 7 void main()8 9 printf(Hello!This

20、 is your home!n);10 在该实例中,指定对hello1.c和hello2.c进行输出,并指定行号。P24 cp、mv和rm(1)作用。 cp:将给出的文件或目录复制到另一文件或目录中。 mv:为文件或目录改名或将文件由一个目录移入另一个目录中。 rm:删除一个目录中的一个或多个文件或目录。(2)格式。 cp:cp 选项 源文件或目录 目标文件或目录 mv:mv 选项 源文件或目录 目标文件或目录 rm:rm 选项 文件或目录(3)常见参数。 cp主要选项参数如表2.12 所示。 cp命令常见参数列表选项参数含义-a保留链接、文件属性,并复制其子目录,其作用等于dpr 选项的组合

21、-d复制时保留链接-f删除已经存在的目标文件而不提示-i在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,而且是交互式复制-p此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中-r若给出的源文件是一个目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名 mv主要选项参数如表2.13 所示。 mv命令常见参数列表选项参数含义-i若mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,并要求用户回答y或n,这样可以避免误覆盖文件-f禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示,在指定此选项后,i选项将不

22、再起作用 rm主要选项参数如表2.14所示。 rm命令常见参数列表选项参数含义-i进行交互式删除-f忽略不存在的文件,但从不给出提示-r指示rm将参数中列出的全部目录和子目录均递归地删除(4)使用实例。 cprootwww hello# cp -a ./my/why/ ./rootwww hello# lsmy why该实例使用-a 选项将“/my/why”目录下的所有文件复制到当前目录下。而此时在原先目录下还有原有的文件。 mvrootwww hello# mv -i ./my/why/ ./rootwww hello# lsmy why该实例中把“/my/why”目录下的所有文件移至当前目

23、录,则原目录下文件被自动删除。 rmrootwww hello# rm r -i ./whyrm: descend into directory ./why? yrm: remove ./why/my.c? yrm: remove directory ./why? y该实例使用“-r”选项删除“./why”目录下所有内容,系统会进行确认是否删除。(5)使用说明。 cp:该命令把指定的源文件复制到目标文件,或把多个源文件复制到目标目录中。 mvn 该命令根据命令中第二个参数类型的不同(是目标文件还是目标目录)来判断是重命名还是移动文件,当第二个参数类型是文件时,mv 命令完成文件重命名,此时,它

24、将所给的源文件或目录重命名为给定的目标文件名;n 当第二个参数是已存在的目录名称时,mv 命令将各参数指定的源文件均移至目标目录中;n 在跨文件系统移动文件时,mv 先复制,再将原有文件删除,而连至该文件的链接也将丢失。 rmn 如果没有使用- r 选项,则rm不会删除目录;n 使用该命令时一旦文件被删除,它是不能被恢复的,所以最好使用-i参数。P27 chmod7chmod(1)作用。改变文件的访问权限。(2)格式。chmod 可使用符号标记进行更改和八进制数指定更改两种方式,因此它的格式也有两种不同的形式。 符号标记:chmod 选项符号权限符号权限文件其中的符号权限可以指定为多个,也就是

25、说,可以指定多个用户级别的权限,但它们中间要用逗号分开表示,若没有显式指出则表示不作更改。 八进制数:chmod 选项 八进制权限 文件其中的八进制权限是指要更改后的文件权限。(3)选项参数。chmod 主要选项参数如表2.16 所示。 表2.16 chmod命令常见参数列表选项参数含义-c若该文件权限确实已经更改,才显示其更改动作-f若该文件权限无法被更改也不要显示错误信息-v显示权限变更的详细资料(4)使用实例。chmod 涉及文件的访问权限,在此对相关的概念进行简单的回顾。在1.3.1 节中已经提到,文件的访问权限可表示成:- rwx rwx rwx。在此设有3种不同的访问权限:读(r)

26、、写(w)和运行(x)。3 个不同的用户级别:文件拥有者(u)、所属的用户组(g)和系统里的其他用户(o)。在此,可增加一个用户级别a(all)来表示所有这3 个不同的用户级别。 第一种符号连接方式的chmod命令中,用加号“+”代表增加权限,用减号“”代表删除权限,等于号“=”代表设置权限。例如,原先笔者系统中有文件uClinux.tgz,其权限如下所示。rootlocalhost test# ls l-rw-r-r- 1 root root Mar 24 2005uClinux.tgzrootlocalhost test# chmod a+rx,u+w uClinux.tgzrootloc

27、alhost test# ls l-rwxr-xr-x 1 root root Mar 24 2005uClinux.tgz可见,在执行了chmod之后,文件拥有者除拥有所有用户都有的可读和执行的权限外,还有可写的权限。 对于第二种八进制数指定的方式,将文件权限字符代表的有效位设为“1”,即“rw-”“rw-”和“r-”的八进制表示为“110”、“110”、“100”,把这个二进制串转换成对应的八进制数就是6、6、4,也就是说该文件的权限为664(三位八进制数)。这样对于转化后八进制数、二进制及对应权限的关系如表2.17 所示。表2.17 转化后八进制数、二进制及对应权限的关系转换后八进制数二

28、 进 制对 应 权 限转换后八进制数二 进 制对 应 权 限0000没有任何权限1001只能执行2010只写3011只写和执行4100只读5101只读和执行6110读和写7111读、写和执行同上例,原先笔者系统中有文件genromfs-0.5.1.tar.gz,其权限如下所示。rootlocalhost test# ls l-rw-rw-r- 1 david david 20543 Dec 29 2004genromfs-0.5.1.tar.gzrootlocalhost test# chmod 765 genromfs-0.5.1.tar.gzrootlocalhost test# ls l

29、-rwxrw-r-x 1 david david 20543 Dec 29 2004genromfs-0.5.1.tar.gz可见,在执行了chmod 765 之后,该文件的拥有者权限、文件组权限和其他用户权限都恰当地对应了。(5)使用说明n 使用chmod必须具有root权限。P31 ln(1)作用。为某一个文件在另外一个位置建立一个符号链接。当需要在不同的目录用到相同的文件时,Linux 允许用户不用在每一个需要的目录下都存放一个相同的文件,而只需将其他目录下的文件用ln命令链接即可,这样就不必重复地占用磁盘空间。(2)格式。ln选项 目标 目录(3)常见参数。n -s 建立符号链接(这也

30、是通常惟一使用的参数)。(4)使用实例。rootlocalhost test# ln -s ./genromfs-0.5.1.tar.gz ./hellorootlocalhost test# ls -ltotal 77948lrwxrwxrwx 1 root root 24 Jan 14 00:25 hello- ./genromfs-0.5.1.tar.gz该实例建立了当前目录的hello 文件与上级目录之间的符号链接,可以看见,在hello的ls l中的第一位为“l”,表示符号链接,同时还显示了链接的源文件。(5)使用说明。n ln命令会保持每一处链接文件的同步性,也就是说,不论改动了哪

31、一处,其他的文件都会发生相同的变化。n ln的链接分软链接和硬链接两种。软链接就是上面所说的ln -s * *,它只会在用户选定的位置上生成一个文件的镜像,不会重复占用磁盘空间,平时使用较多的都是软链接。硬链接是不带参数的ln * *,它会在用户选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。P34 表2.25 Linux 常见类型的文件解压命令一览表P62 函数静态库和动态库在成功编译之后,就进入了链接阶段。这里涉及一个重要的概念:函数库。读者可以重新查看这个小程序,在这个程序中并没有定义“printf”的函数实现,且在预编译中包含进的“stdio.h

32、”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?最后的答案是:系统把这些函数的实现都放到名为libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6 函数库中去,这样就能调用函数“printf”了,而这也正是链接的作用。函数库有静态库和动态库两种。静态库是指编译链接时,将库文件的代码全部加入可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名通常为“.a”。动态库与之相反,在编译链接时并没有将库文件的代码加入可执行文件中,而是在程序执行时加

33、载库,这样可以节省系统的开销。一般动态库的后缀名为“.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件,如下所示。rootlocalhost gcc# gcc hello.o o hello运行该可执行文件,出现的正确结果如下。rootlocalhost gcc# ./helloHello! This is our embedded world!P76 makefile3.5.2 makefile变量david:kang.o yul.ogcc kang.o bar.o -o myprogkang.o : kang.c k

34、ang.h head.hgcc Wall O -g c kang.c -o kang.oyul.o : bar.c head.hgcc - Wall O -g c yul.c -o yul.o在这个makefile 中有3 个目标体(target),分别为david、kang.o 和yul.o,其中第一个目标体的依赖文件就是后两个目标体。如果用户使用命令“make david”,则make管理器就是找到david目标体开始执行。这时,make会自动检查相关文件的时间戳。首先,在检查“kang.o”、“yul.o”和“david”3个文件的时间戳之前,它会向下查找那些把“kang.o”或“yul

35、.o”作为目标文件的时间戳。比如,“kang.o”的依赖文件为“kang.c”、“kang.h”、“head.h”。如果这些文件中任何一个的时间戳比“kang.o”新,则命令“gcc Wall O -g c kang.c -okang.o”将会执行,从而更新文件“kang.o”。在更新完“kang.o”或“yul.o”之后,make 会检查最初的“kang.o”、“yul.o”和“david”3 个文件,只要文件“kang.o”或“yul.o”中的至少有一个文件的时间戳比“david”新,则第二行命令就会被执行。这样,make就完成了自动检查时间戳的工作,开始执行编译工作。这也就是make工作

36、的基本流程。接下来,为了进一步简化编辑和维护makefile,make 允许在makefile中创建和使用变量。变量是在makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。在具体要求下,这些值可以代替目标体、依赖文件、命令以及makefile文件中其他部分。在makefile中的变量定义有两种方式:一种是递归展开方式,另一种是简单方式。递归展开方式定义的变量是在引用该变量时进行替换的,即如果该变量包含了对其他变量的引用,则在引用该变量时一次性将内嵌的变量全部展开,虽然这种类型的变量能够很好地完成用户的指令,但是它也有严重的缺点,如不能在变量后追加内容(因为语句:C

37、FLAGS = $(CFLAGS) -O在变量扩展过程中可能导致无穷循环)。为了避免上述问题,简单扩展型变量的值在定义处展开,并且只展开一次,因此它不包含任何对其他变量的引用,从而消除变量的嵌套引用。递归展开方式的定义格式为:VAR=var。简单扩展方式的定义格式为:VAR:=var。make中的变量使用均使用的格式为:$(VAR)。变量名是不包括“:”、“#”、“=”以及结尾空格的任何字符串。同时,变量名中包含字母、数字以及下划线以外的情况应尽量避免,因为它们可能在将来被赋予特别的含义。变量名是大小写敏感的,例如变量名“foo”、“FOO”、和“Foo”代表不同的变量。推荐在makefile

38、内部使用小写字母作为变量名,预留大写字母作为控制隐含规则参数或用户重载命令选项参数的变量名。下面给出了上例中用变量替换修改后的makefile,这里用OBJS 代替kang.o 和yul.o,用CC代替gcc,用CFLAGS代替“-Wall -O g”。这样在以后修改时,就可以只修改变量定义,而不需要修改下面的定义实体,从而大大简化了makefile维护的工作量。经变量替换后的makefile如下所示:OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS)$(CC) $(OBJS) -o davidkang.o : kang

39、.c kang.h$(CC) $(CFLAGS) -c kang.c -o kang.oyul.o : yul.c yul.h$(CC) $(CFLAGS) -c yul.c -o yul.o可以看到,此处变量是以递归展开方式定义的。makefile 中的变量分为用户自定义变量、预定义变量、自动变量及环境变量。如上例中的OBJS就是用户自定义变量,自定义变量的值由用户自行设定,而预定义变量和自动变量为通常在makefile都会出现的变量,它们的一部分有默认值,也就是常见的设定值,当然用户可以对其进行修改。预定义变量包含了常见编译器、汇编器的名称及其编译选项。表3.15 列出了makefile中

40、常见预定义变量及其部分默认值。表3.15 makefile中常见的预定义变量可以看出,上例中的CC和CFLAGS是预定义变量,其中由于CC没有采用默认值,因此,需要把“CC=gcc”明确列出来。由于常见的gcc 编译语句中通常包含了目标文件和依赖文件,而这些文件在makefile文件中目标体所在行已经有所体现,因此,为了进一步简化makefile的编写,就引入了自动变量。自动变量通常可以代表编译语句中出现目标文件和依赖文件等,并且具有本地含义(即下一语句中出现的相同变量代表的是下一语句的目标文件和依赖文件)。表3.16 列出了makefile中常见的自动变量。自动变量的书写比较难记,但是在熟练

41、了之后使用会非常方便,请读者结合下例中的自动变量改写的makefile进行记忆。OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS)$(CC) $ -o $kang.o : kang.c kang.h$(CC) $(CFLAGS) -c $ -o $yul.o : yul.c yul.h$(CC) $(CFLAGS) -c $ -o $另外,在makefile中还可以使用环境变量。使用环境变量的方法相对比较简单,make 在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量。但是,如果用户

42、在makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量。3.5.3 makefile规则makefile的规则是make进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句。在上面的例子中,都显式地指出了makefile中的规则关系,如“$(CC) $(CFLAGS)-c $ -o $”,但为了简化makefile的编写,make还定义了隐式规则和模式规则,下面就分别对其进行讲解。1隐式规则隐含规则能够告诉make 怎样使用传统的规则完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可。make 会自动搜索隐式规则目录来确定如

43、何生成目标文件。如上例就可以写成:OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS)$(CC) $ -o $为什么可以省略后两句呢?因为make 的隐式规则指出:所有“.o”文件都可自动由“.c”文件使用命令“$(CC) $(CPPFLAGS) $(CFLAGS) -c file.c o file.o”来生成。这样“kang.o”和“yul.o”就会分别通过调用“$(CC) $(CFLAGS) -c kang.c -o kang.o”和“$(CC) $(CFLAGS) -c yul.c -o yul.o”来生成。在隐式规

44、则只能查找到相同文件名的不同后缀名文件,如“kang.o”文件必须由“kang.c”文件生成。表3.17 给出了常见的隐式规则目录。2模式规则模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式规则仅仅能够用make 默认的变量来进行操作,而模式规则还能引入用户自定义变量,为多个文件建立相同的规则,从而简化makefile的编写。模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明。使用模式规则修改后的makefile的编写如下:OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS)$(CC) $ -o $%.o : %.c$(CC) $(CFLAGS) -c $ -o $3.5.4 make管理器的使用使用make管理器非常简单,只需在make命令的后面键入目标名即可建立指定的目标,如果直接运行make,则建立makefile中的第一个目标。此外make还有丰富的命令行选项,可以完成各种不同的功能。表3.18 列出了常用的make命令行选项。P133 NFS文件系统NFS为Network File System的简称,最早是由Sun公司提出发展起来的,其目的就是让不同的机器、不同的操

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com