痞菜
级别:管理员 威望:9 经验:18 货币:99999 体力: 来源:不知道 总发帖数:2602 注册日期:2001-04-13
|
|
查看 邮件 主页 QQ 消息 引用 复制 下载
安装GCC GCC的安装
通过下面的命令安装GCC: mkdir $LFS/usr/src/gccbuild && cd
$LFS/usr/src/gccbuild && ../gcc2.95.2.1/configure
prefix=/usr \ withgxxincludedir=/usr/include/g++ \
enablelanguages=c,c++ disablenls && make e
LDFLAGS=static bootstrap && make prefix=$LFS/usr
local_prefix=$LFS/usr/local \
gxx_include_dir=$LFS/usr/include/g++ install && cd
$LFS/lib && ln s ../usr/bin/cpp && cd
$LFS/usr/lib && ln s ../bin/cpp && cd
$LFS/usr/bin && ln s gcc cc 命令解释
--enable-languages=c,c++:
这个编译参数仅仅安装GCC中的C和C++编译器,如果需要安装其它不常用的编译器,您可以简单地省略“--enable-languages”编译参数。
ln -s ../usr/bin/cpp:
这条命令创建到$LFS/lib/cpp的符号链接,某些程序包指定在/lib下查找cpp。 ln -s ../bin/cpp:
这条命令创建到$LFS/usr/lib/cpp的符号链接,某些程序包指定在/usr/lib下寻找cpp。 内容
Contents GCC包包含编译器、预处理程序和GNU C++库。 说明 编译器
编译器的功能是将文本格式的源代码编译成计算机能够理解的格式。源代码文件编译成目标文件后,目标代码连接器就会根据这个编译器产生的一个或多个目标文件产生一个可执行文件。
预处理程序
预处理程序或称编译预处理器实现对源代码进行编译前的预处理,例如将源代码中指定的头文件包含进来。通过头文件声明引入代码是一个节省编程时间的非常好的思想。您可以仅仅通过在代码头中插入类似#include
<filename>的代码,预处理器就可以将您指定的文件的全部内容插入到需要编译的源代码中。 C++ 库
C++库是C++程序所使用的,C++库包括C++程序中经常使用的函数,这样就可以保证程序员不必要在每次编写新的程序时都重新些某些特定的通用函数(如将文本输出到终端屏幕的函数)。
安装Linux内核 Linux内核的安装
我们不是要编译一个新的内核影象。我们会在完成本章的基本系统软件的安装后做这件事。但是,由于某些软件需要内核的一些头文件,所以我们现在需要将内核归档文件解包安装以便编译那些需要内核头文件的程序包。
通过执行下面的命令可以实现内核配置文件的创建工作: make mrproper
&& yes "" | make config && make dep
&& cd $LFS/usr/include && cp R
../src/linux/include/linux . && mkdir asm &&
cp a ../src/linux/include/asm/* asm
命令解释
make mrproper: 这条命令确保内核树(kernel tree)是绝对干净的。
yes "" | make config: 这条命令执行make
config并且用缺省值回答config脚本询问用户的每一个问题(它通过简单的等效于用户敲<Enter>键以接受问题缺省的Y或N答案来实现)。这里,我们并不是在配置真正的内核,我们仅仅是为了创建一些运行make
dep所必须的配置文件,然后在$LFS/usr/src/linux/include/linux目录下创建一些象version.h一类的文件,这些文件会在编译Glibc和chroot等其它程序包时需要。
make dep: make
dep检查依赖并且设置依赖文件。我们不必关心依赖检查,我们真正关心的是前面提到的make
dep在$LFS/usr/src/linux/include/linux目录下创建的后面会用到的一些文件。
cp -R ../src/linux/include/linux . 与 mkdir
asm && cp -a ../src/linux/include/asm/*
.:这些命令拷贝内核的头文件到$LFS/usr/include中,如果您想知道为什么我们不再创建这些目录的连接而是拷贝它们,请参阅内核源代码的README文件。
内容 Linux内核包包含Linux内核。 说明
Linux和每一个Linux系统的心脏,它为系统提供生命的脉搏。当打开计算机电源并且引导Linux系统时,最先载入载入的Linux软件就是内核。内核初始化系统的硬件组件,诸如:串口、并口、声卡、网卡IDE控制器、SCSI控制器等等。简而言之,内核让软件能够在硬件上得以运行。
安装Grep Grep的安装 通过下面的命令安装Grep: export
CPPFLAGS=-Dre_max_failures=re_max_failures2 &&
./configure --prefix=$LFS/usr --disable-nls && unset
CPPFLAGS && make LDFLAGS=-static && make
install 内容 Grep包包含egrep、fgrep和grep程序。
说明 egrep egrep打印文件中匹配扩展正则表达式样板的行。 注:egrep(expression
grep)扫描文件搜索一个字符模式,并且打印包含此模式的所有行,egrep使用完全规则表达式(使用字母数字和专用字符完全集作为串值的表达式)来匹配此模式,它使用快速判断算法,但有时需要额外的空间
fgrep
fgrep打印文件中匹配固定串列表(以新行分隔)的行,列表中的固定串必须全部匹配。fgrep与grep和egrep不同之处在于它适用于串,而不是对匹配表达式模式的搜索。
grep grep打印文件中匹配基本的正则表达式样板的行。 安装Gzip Gzip的安装
在安装Gzip以前,必须首先解压缩gzip补丁文件。 patch -Np1 -i
../gzip-1.2.4a.patch && ./configure --prefix=$LFS/usr
&& make LDFLAGS=-static && make install
&& cp $LFS/usr/bin/gunzip $LFS/usr/bin/gzip $LFS/bin
&& rm $LFS/usr/bin/gunzip $LFS/usr/bin/gzip
内容
Gzip包包含compress、gunzip、gzexe、gzip、uncompress、zcat、zcmp、zdiff、zforece、zgrep、zmore和znew程序。
说明 gunzip gunzip可以解压缩由gzip压缩过的文件。
gzexe
gzexe将文件压缩成可以自解压的可执行文件(当然要牺牲一定的压缩性能)。 gzip
gzip通过Lempel-Ziv编码(LZ77)压缩指定文件的大小。 zcat
zcat可以将命令行或其标准输入中指定的一列文件解压缩并将解压缩的数据写到标准输出上。
zcmp zcmp在压缩文件上调用cmp程序。 zdiff
zdiff在压缩文件上调用diff程序。 Zforce
Zforce强制性地为每一个gzip文件加上.gz扩展名,这样gzip就不会对它们再次进行压缩。这个程序可能在一个文件经过传输后名字被截短的情况下能够派上用场。
zgrep zgrep在压缩文件上调用grep程序。 zmore
zmore是一个过滤器,它允许在一个软拷贝(soft-copy)终端上每次一屏地检查已经压缩过或普通的文本文件(和more程序很相似)。
znew znew将.Z (compress)格式的文件转压缩成.gz (gzip)格式。 安装Make
Make的安装 通过下面的命令安装make: ./configure
--prefix=$LFS/usr --disable-nls && make LDFLAGS=-static
&& make install
内容 Make包包含make程序 说明
make程序能够自动地确定一个大型程序的哪些片段需要重新编译,并且发出命令去重新编译它们。
安装Sed Sed的安装 通过下面的命令安装Sed: export
CPPFLAGS=-Dre_max_failures=re_max_failures2 &&
./configure --prefix=$LFS/usr --bindir=$LFS/bin &&
unset CPPFLAGS && make LDFLAGS=-static &&
make install 内容 Sed包包含sed程序 说明
sed是一个流编辑器。流编辑器用于在标准的输入流(文件或管道的输入)上完成基本的流转换。 安装Shellutils
Sh-utils的安装 在安装Sh-utils之前,必须首先将sh-utils打包文件解包。
patch
-Np1 -i ../sh-utils-2.0.patch && ./configure
--prefix=$LFS/usr --disable-nls && make LDFLAGS=-static
&& make install && cd $LFS/usr/bin
&& mv date echo false pwd stty $LFS/bin &&
mv su true uname hostname $LFS/bin 内容
Shellutils包包含basename、chroot、date、dirname、echo、env、expr、factor、false、groups、hostid、hostname、id、logname、nice、nohup、pathchk、pinky、printenv、printf、pwd、seq、sleep、stty、su、tee、test、true、tty、uname、uptime、users、who、whoami和yes程序。
说明 basename basename将文件名上的目录和后缀剥去。 chroot
chroot允许通过指定的根目录运行命令或交互式shell。 date
date通过指定格式显示当前时间或设置系统日期。 dirname dirname从文件名上将非目录后缀剥去。
echo echo显示一行文本。 env env更改系统环境,保证程序在新环境中运行。 expr
expr可以求解表达式的值。 factor factor打印所有指定整数的素因子。 false
false退出程序时将状态码标识为失败。 groups groups打印用户所在的用户组。 hostid
hostid打印当前主机的数字标识符(十六进制格式) 。 hostname
hostname设置或打印当前主机系统的主机名。 id
id打印一个用户或当前用户的真实有效的UIDs和GIDs。 logname logname打印当前用户的登录名。
nice nice通过修改后的调度优先级运行一个程序。 nohup
nohup以避免挂起的方式运行输出不是TTY节点的命令。 pathchk
pathchk检查文件名是否有效或可移植。 pinky
pinky是一个可以获得一个指定用户信息的小型finger实用程序。 printenv
printenv打印全部或者部分系统环境配置。 printf
printf将数据进行格式化并且打印(功能与C语言中的printf函数相同)。 pwd
pwd打印当前工作目录的名字。 seq seq是一个序列号程序,它打印一个在特定范围内以指定的增量产生的数值。
sleep sleep延迟指定量的时间。 stty stty改变并且打印TTY终端的行设置。
su su使用替代的用户和组ID运行shell。 tee
tee从标准输入读取信息并且写到标准输出和文件中。 test test检查文件类型并能够进行值比较。
true True退出时将状态码标识为成功。 tty tty打印连接标准输入的终端的文件名。
uname uname打印系统信息。 uptime uptime告诉您系统已经运行了多少时间。
users users打印登录到当前主机的当前用户的用户名。 who who显示谁曾经登录过。
whoami whoami打印用户的有效userid。 yes yes重复地输出
一个字符串知道程序被杀死。 安装Tar Tar的安装
为了可以通过tar直接使用bzip2文件,请使用LFS的FTP站点上的tar程序包。这个包为tar增加了一个与tar的-z选项(能够用于gzip文件)用法相同的-y选项。
通过运行下面的命令解开这个程序包: cd src &&
patch -i ../../gnutarpatch.txt && cd ..
通过下面的命令安装Tar: ./configure prefix=$LFS/usr
disablenls \ libexecdir=$LFS/usr/bin bindir=$LFS/bin &&
make LDFLAGS=static && make install 内容
tar包包含tar和rmt程序。 说明 tar
tar是一个用于存储和解压称为tar存档文件的文件归档程序。 rmt
rmt是一个通过进程间通信连接操作磁带驱动器的远程堆放与存储程序。 安装Textutils
Textutils的安装 通过运行下面的命令安装Textutils:
./configure --prefix=$LFS/usr --disable-nls &&
make LDFLAGS=-static && make install &&
mv $LFS/usr/bin/cat $LFS/bin 内容
Textutils包包含cat、cksum、comm、split、cut、expand、fmt、fold、head、join、md5sum、nl、od、paste、pr、ptx、sort、split、sum、tac、tail、tr、tsort、unexpand、uniq和wc程序。
说明 cat cat连接文件或将标准输入连接到标准输出。 cksum
cksum打印指定文件的CRC校验和及字节数。 comm comm逐行地比较两个指定的文件。
csplit csplit通过给定的模式将拆分成多个片段并输出到文件xx01, xx02, ...,
并将每个片段的字节数输出到标准输出。 cut cut将指定文件的选定部分行打印到标准输出。 expand
expand将文件中的<TAB>字符转换成空格并将其写到标准输出。 fmt
fmt重新格式化指定文件内的每一个段落,并写到标准输出。 fold
fold将每一个指定文件(缺省是标准输入)的输入行进行打包并写到标准输出。 head 打印每一个指定文件的头xx
(缺省是10)行到标准输出。 join join在一个公共字段上连接两个文件的行。 md5sum
md5sum打印或检测MD5校验和。 nl nl将每个指定文件写到标准输出并且加上行号。
od
od将一个指定文件的明确表述(通常是8个字节)写到标准输出。
paste
paste合并几个指定文件(以<TAB>键分隔)中的相同行并写到标准输出。
pr
pr命令对文件进行分页或分列格式化并打印。 ptx
ptx为文件内容产生一个序列(PERMUTE:某些资料译成交换式)索引。 sort
sort分类或/和合并文件并写到标准输出。 split
split将一个输入文件分成固定大小的块并将它们写到PREFIXaa、PREFIXab、……等文件中。 sum
sum打印指定文件的校验和和块数。 tac
tac按照行号的倒序将指定的文件写到标准输出。 tail tail打印每一个指定文件的最后xx
(缺省为10)行到标准输出。 tr tr通过替换(翻译、紧缩)或删除被选定字符的方式将标准输入复制到标准输出。
tsort tsort在标准输出上产生一个完全排序的项目清单,它们指定文件中项目的偏序是一致的。
unexpand unexpand将每一个文件中的空格转换成制表符并写到标准输出。 uniq
uniq将文件或标准输入中相邻重复的行删除然后写到文件或标准输出。 wc
wc显示指定文件的行、字和字符计数。如果指定多个文件,则会同时显示所有文件的总行数。 安装Mawk
Mawk的安装 通过下面的命令安装Mawk:
./configure &&
sed \ s/"\$(CC) \$(CFLAGS) o"/"\$(CC) \$(CFLAGS) \$(LDFLAGS)
o"/ \ Makefile | make f LDFLAGS=static && make
BINDIR=$LFS/usr/bin \ MANDIR=$LFS/usr/share/man/man1 install
内容 Mawk包包含mawk程序。 说明 mawk
Mawk是AWK(模式扫描与处理语言)编程语言的解释器。AWK语言对于数据文件的操作、文本的存取与处理以及算法的原型化和实验等来说很有用。
安装Texinfo Texinfo的安装 通过下面的命令安装Texinfo: ./configure
--prefix=$LFS/usr --disable-nls && make LDFLAGS=-static
&& make install 内容
Texinfo包包含info、install-info、makeinfo、texi2dvi和texindex程序。 说明
info
info程序读取Info文档(通常在/usr/doc/info目录下)。Info文档类似于man(ual)页,同仅仅解释程序的选项的man相比,info试图解释一些更深入的知识。
install-info
install-info程序更新info的条目。当运行info程序时,应该为其提供一个可用的主题列表。install-info就是用来维护主题列表的程序,如果info文件被手工删除了,那么也一定要在索引文件中删除相应的主题。install-info程序就是为了这个目的而设计的。当填加info文档时,这个程序同样可用。
makeinfo
makeinfo程序将Texinfo源文档翻译成不同的格式,可用的格式包括:info文件,纯文本和HTML。
texi2dvi texi2dvi程序打印Texinfo文档。 texindex
texindex程序用于分类Texinfo索引文件。
安装Patch Patch的安装
使用下面的命令通过Make安装:
./configure --prefix=$LFS/usr
&& make LDFLAGS=-static && make install
内容 Patch包包含patch程序。 说明
patch程序根据补丁(patch)文件修改一个文件。补丁文件通常是使用diff程序建立的一个列表,这个列表包含如何修改原始文件的一些指令。由于节省时间和空间,Patch经常用于源代码的修补。可以想象一个有1MB的程序包,这个程序包的下一个版本仅仅改变了前面一个版本的两个文件的内容,这个新版本可以完全以一个1MB
的新版本进行发布或者以一个仅仅有1KB的补丁文件进行发布。这个补丁文件可以对第一个版本的进行更新,更新后的版本就和第二个版本完全一致了。因此,如果已经下载了第一个版本,那么为了下一个版本而进行的大数据量下载工作就可以有效地避免。
创建passwd和group文件
为了让root用户和用户组能够通过系统认证并登录到系统,在/etc/passwd和/etc/group文件中必须为其设置入口。除了根用户组外,另外一些组也是推荐并是某些包所要求的。有下面列出GID的用户组不是任何标准的一部分。除了根用户组以外,LSB仅仅推荐将bin组的GID定义为GID
1。其它用户组名和GID可以由用户任意选择。一般来说,写得较好的程序包并不是依赖GID的数值而是采用用户组名。因为这样一来,一个组有什么样的GID对程序并没有任何影响。由于对用户组没有定义任何标准,所以我也没有遵从被Debian、RedHat和任何其它版本所采用的惯例。这里所填加的组是MAKEDEV脚本(它是/dev下创建设备文件的脚本)里所提到的。
通过下面的命令创建一个新的$LFS/etc/passwd文件:
echo
"root:x:0:0:root:/root:/bin/bash" > $LFS/etc/passwd
通过下面的命令创建一个新的$LFS/etc/group文件: cat > $LFS/etc/group
<< "EOF" root:x:0: bin:x:1: sys:x:2: kmem:x:3:
tty:x:4: tape:x:5: daemon:x:6: floppy:x:7:
disk:x:8: lp:x:9: dialout:x:10: audio:x:11: EOF
拷贝旧的NSS库文件
如果你的当前Linux系统运行的是glibc-2.0,你需要将NSS库文件拷贝到LFS分区。某些静态链接的程序仍然依赖于NSS库,尤其是那些需要查找用户名、用户ID和组ID的程序更是这样。您可以通过采用简单地执行这些库的方法来检查您当前的Linux系统运行的是哪个版本的C库,方法如下:
/lib/libc.so.6
执行结果的第一行会会告诉您发布的版本。接下来的行包含有趣的信息,如果您当前的系统中已经安装了Glibc-2.0.x,请通过下面的命令拷贝NSS库:
cp -av /lib/libnss* $LFS/lib
--------------------------------------------------------------------------------
安装$LFS/proc文件系统
为了某些程序能够正常地运行,必须安装proc文件系统并且保证chroot'ed环境下是可以访问的。安装
proc两次或者两次以上并不会有什么问题,因为它是有内核本身维护的虚拟文件系统。
通过下面的命令在$LFS/proc下安装proc文件系统:
mount proc $LFS/proc -t
proc 第六章 安装基本的系统软件 简介
所有软件的安装工作都是很直截了当的。您可能会认为为每一个包给出基本的安装说明并且仅仅解释为了安装一个包需要哪些预备工作可能要更加简单明了。虽然我同意这种说法,但是我还是选择给出每一个包的安装说明,这样可以避免任何可能的混淆或错误的发生。
如果您希望为随后的章节中的包安装进行编译器优化,那么现在是关注编译器优化提示的时候了。编译器优化能够让程序运行得更快,但是也可能会引起某些编译问题。如果您在使用优化有出了问题,最好的办法是在没有优化的情况下进行编译,看看相同的问题是否还会发生。
--------------------------------------------------------------------------------
关于调试记号 在缺省情况下,大多数程序和库都是带调试记号((gcc option
-g))编译的。现在我解释一下这些调试记号是什么,并且说明为什么您可能不想要这些记号。
一个带调试记号编译的程序意味着用户能够通过调试器运行一个程序或库,并且这些调试器具有用户友好的输出。但是,这些调试记号明显地增大了程序和库。
在您想知道这些调试记号是否真的带来很大的差异之前,请看下面的统计资料,相信您可以从这些资料里得出您自己的结论。
带调试记号的动态Bash二进制文件:1.2MB 不带调试记号的动态Bash二进制文件:478KB
带调试记号的/lib和/usr/lib下的文件(包括glibc和gcc文件):87MB
不带调试记号的/lib和/usr/lib下的文件(包括glibc和gcc文件):16MB
根据使用的编译器和链接动态程序的C库的版本的不同,文件的大小可能会有些不同,但是比较带与不带调试记号的程序的比较结果应该不会改变。我调试完成这一章后,将所有LFS的二进制文件的调试记号剥去,我又得到了超过102
MB的磁盘空间,可见两者的不同。
从二进制文件(必须是a.out或ELF二进制)移去调试记号的方法是执行
strip --strip-debug filename 可以使用通配符将多个文件中的调试记号剥除
(类似这样的用法:strip --strip-debug
$LFS/usr/bin/*)。大多数人可能从来不在软件中使用调试器,因此通过移除这些记号可以节省大量的磁盘空间。
您可以访问下面的网站http://cvs.linuxfromscratch.org/index.cgi/hints/获得更多关于编译优化的提示信息。
--------------------------------------------------------------------------------
创建$LFS/root/.bash_profile
当我们在下一节已经进入chroot'ed环境后,我们希望export一些环境变量,我们希望shell中的PS1、PATH和其它一些变量已经设置好了。为了达到这个目的,我们将创建一个$LFS/root/.bash_profile文件,这个文件会在我们进入chroot环境时自动被bash所读取。
通过下面的命令创建新文件$LFS/root/.bash_profile:
cat >
$LFS/root/.bash_profile << "EOF" # Begin
/root/.bash_profile
PS1='\u:\w\$ '
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PS1 PATH
# End /root/.bash_profile EOF
其它的环境变量、别名等等信息则根据您自己的意愿来加入,方法是一致的。
--------------------------------------------------------------------------------
进入chroot'ed环境 现在是进入我们的chroot'ed环境以便安装我们所需要的其它软件时候了。
输入下面的命令进入chroot'ed环境。从现在开始,$LFS变量就不再需要了,因为用户所做的每件事都现在在LFS分区下(因为“/”事实上就是“/mnt/lfs”,只是shell不知道这些罢了)
cd $LFS && chroot $LFS /usr/bin/env i HOME=/root
\ TERM=$TERM /bin/bash login
TERM=$TERM句子会将chroot环境内的$TERM值设置成与chroot外的相同,这样可以使象vim和less等程序可以正常运行。
现在,我们已经在chroot'ed环境下了,我们可以继续安装所有的基本系统软件了。您必须确保本章和以后章节中的所有命令都是在chroot'ed
环境下执行的。如果已经离开了这个环境(如重启动等原因),请记住一定要在继续工作以前重新安装$LFS/proc并且重新进入chroot。
注意,bash提示中会包含"I have no name!",这个很正常,因为Glibc还没有安装。
--------------------------------------------------------------------------------
安装Glibc Glibc的安装
在glibc-2.2.1目录而不是/usr/src下将glibc-linuxthreads解包。
然后通过下面的命令安装Glibc: mknod m 0666 /dev/null c 1 3 &&
touch /etc/ld.so.conf && mkdir /usr/src/glibcbuild
&& cd /usr/src/glibcbuild && sed
s/"\$(PERL)"/"\/usr\/bin\/perl"/ \ ../glibc2.2.1/malloc/Makefile
> tmp~ && mv tmp~ ../glibc2.2.1/malloc/Makefile
&& sed "s/root/0/" ../glibc2.2.1/login/Makefile >
tmp~ && mv tmp~ ../glibc2.2.1/login/Makefile &&
../glibc2.2.1/configure \ prefix=/usr enableaddons \
libexecdir=/usr/bin && sed s/"crosscompiling =
yes"/"crosscompiling = no"/ \ config.make > config.make~
&& mv config.make~ config.make && make
&& make install && make
localedata/installlocales
在配置阶段您将看到下面的警告信息:
configure: warning: *** An auxiliary program is missing
or too old; *** some features will be disabled. *** Check
the INSTALL file for required versions.
这个警告指的是gettext包中缺少了msgfmt程序。但是没必要担心这些:有msgfmt程序的时候Glib的安装方法也是一样的,在这种场合完全可以忽略msgfmt而没有任何问题。
通过退出chroot'ed环境在重新进入的方法,您可以在命令行中去掉"I have no
name!"消息。这个消息是由于bash不能将用户id解析成用户名造成的。您不必退出后重新进入chroot,但这里我们强烈推荐确保您使用合适的工作bash。
通过下面的命令实现这一点: logout chroot $LFS /usr/bin/env i
HOME=/root \ TERM=$TERM /bin/bash login 命令解释 mknod -m
0666 /dev/null c 1 3: Glibc需要一个空设备以便成功编译。其它设备的创建将在下一节讨论。 touch
/etc/ld.so.conf:One of the final steps of the Glibc安装的最后一步之一就是运行
ldconfig以更新动态装载器缓存。如果这个文件不存在,Glibc会因为不能读取这个文件而造成异常中断。因此我们为它创建一个空文件(这个空文件可以确保Glibc缺省使用/lib
和/usr/lib,并且现在就没有问题了)。 --enable-add-ons:
这个开关使能Glibc的附加包linuxthreads。 内容 Glibc包包含GNU C库。 说明
C库是一些程序通用的函数集。这样就可以保证程序员不用为了他的每一个单独的任务重复写相同的函数。最常见的情况是象向屏幕输出一个字符串的程序已经可以由程序员随意调用了。
C库(事实上几乎每个库)都有两种风格:动态的和静态的。简而言之,当程序调用静态的C库时,C库中的代码会拷贝到执行文件中。当程序使用动态C库时,可执行文件不会包含C库中的代码。而是在程序运行时动态加载不要的库函数。这就意味着可以明显地减小程序文件的大小。C库中包含的文档描述得更详细些,在这里只用一两行去明确地解释这些复杂知识是不现实的。
--------------------------------------------------------------------------------
创建设备 创建设备
注意:您解压的MAKEDEV.bz2文件不是一个归档文件,因此它并不创建一个可以cd进入的目录。
可以通过下面的命令创建设备文件: chmod 755 MAKEDEV && cp MAKEDEV
/dev && cd /dev && ./MAKEDEV -v generic
MAKEDEV会创建1到20个左右的hda[1-20]和hdb[1-20]。但是要记住由于内核对最大分区数量的限止,您可能不能使用所有上述的设备文件。
命令解释 ./MAKEDEV -v generic:
这条命令创建普通设备。通常,这些设备都是您必须的。可能会丢失一些您的硬件系统配置所必须的特殊设备,您可以通过./MAKEDEV -v
<device>.命令手工创建它们。 内容 MAKEDEV包包含MAKEDEV脚本。 说明
MAKEDEV是一个可以用来帮助创建必须的静态设备文件的脚本,它通常存放在/dev目录下。
--------------------------------------------------------------------------------
安装Man-pages Man-pages的安装 通过下面的命令安装Man-pages: patch
-Np1 -i ../man-pages-1.35.patch && make install
内容 Man-pages包包含丰富的没有随程序包发布的操作手册页。 说明
手册页提供大量的内容,如描述所有的C和C++函数的手册页、/dev/文件以及更多的内容。
--------------------------------------------------------------------------------
安装Ed Ed的安装 通过下面的命令安装Ed:
./configure
--prefix=/usr && make && make install
&& mv /usr/bin/ed /usr/bin/red /bin 内容
Ed包包含ed程序。 说明 Ed是一个面向行的文本编辑器。它用来对文本文件进行创建、显示、修改和其它操作。
安装Patch Patch的安装 通过下面的命令安装Patch: ./configure
--prefix=/usr && make && make install 内容
Patch包包含patch程序
说明
patch程序根据补丁(patch)文件修改一个文件。补丁文件通常是使用diff程序建立的一个列表,这个列表包含如何修改原始文件的一些指令。由于节省时间和空间,Patch经常用于源代码的修补。可以想象一个有1MB的程序包,这个程序包的下一个版本仅仅改变了前面一个版本的两个文件的内容,这个新版本可以完全以一个1MB
的新版本进行发布或者以一个仅仅有1KB的补丁文件进行发布。这个补丁文件可以对第一个版本的进行更新,更新后的版本就和第二个版本完全一致了。因此,如果已经下载了第一个版本,那么为了下一个版本而进行的大数据量下载工作就可以有效地避免。
--------------------------------------------------------------------------------
安装Findutils 安装Findutils
在安装Findutils之前,必须解包findutils补丁文件。 通过下面的命令安装Findutils:
patch -Np1 -i ../findutils-4.1.patch &&
./configure --prefix=/usr && make &&
make libexecdir=/usr/bin install
内容
Findutils包包含find, locate, updatedb, xargs, frcode, code
和bigram程序。 说明 Find
Find程序通过匹配特定准则的方法在目录树中查找文件。如果没有给出任何准则,它列出当前目录下及其子目录下的所有文件。
Locate
Locate在一个包含所有文件和目录的文件系统数据库中进行扫描,并将匹配特定准则的所有文件和目录列出。如果一个用户需要查找一个文件,这个程序会扫描数据库并且告诉他这些文件的具体位置。当然,这种方法只是在locate数据库得到及时更新时才有效,否则将给出过期的信息。
Updatedb
Updatedb程序更新locate数据库。它扫描整个文件系统(包括其它当前安装的文件系统除非您明确指定不这样做),然后将它找到的所有文件和目录信息放入locate程序所使用并获取信息的数据库中。每天对这个数据库更新一次并保证在使用前对其进行更新是很好的主意。
Xargs
Xargs命令可以将一个命令运用于一个文件列表。如果需要在多个文件上执行相同的命令,可以通过建立一个包含所有要执行命令的文件的文件(每行一个文件),然后通过xargs对这个列表执行命令。
frcode
updatedb通过运行一个称为frcode的程序采用front-compression的方式来压缩文件名列表。这样可以4到5倍地减小数据库文件的大小。
code code是frcode的祖先,它在老式的locate数据库上使用。 bigram
bigram与code一起使用用以产生老式locate数据库。想知道最后三个程序的更详细信息,可以阅读locatedb.5手册页。
--------------------------------------------------------------------------------
安装Mawk Mawk的安装 通过下面的命令安装Mawk:
./configure
&& make && make BINDIR=/usr/bin \
MANDIR=/usr/share/man/man1 install && cd /usr/bin
&& ln s mawk awk 内容 Mawk包包含mawk程序。 说明
mawk
Mawk是AWK(模式扫描与处理语言)编程语言的解释器。AWK语言对于数据文件的操作、文本的存取与处理以及算法的原型化和实验等来说很有用。
安装Ncurses Ncurses的安装 通过运行下面的命令安装Ncurses:
./configure prefix=/usr libdir=/lib \ withshared
disabletermcap && make && make install
&& cd /lib && ln s libncurses.a libcurses.a
命令解释 --with-shared: 使能建立共享的ncurses库文件。
--disable-termcap: 去掉termcap的错误回退编译支持。 ln -s libncurses.a
libcurses.a: 建立/lib/libcurses.a符号链接,这个链接由于有些原因没有在libncurses的安装时建立。
内容 Ncurses包包含ncurses, panel, menu和form库。它也包含tic, infocmp,
clear, tput, toe和tset程序。 说明 库
构成Ncurses库的函数库用于在屏幕上显示文本(通常是显示奇特的字样)。一个会用到ncurses的例子是在内核的“make
menuconfig”处理过程中。这些库包含建立棉板、菜单、窗体和通用文本显示的程序。 Tic
Tic是terminfo项说明的编译器。这个程序通过ncurses库将源代码格式的terminfo文件转换成编译后格式(二进制)的文件。
Terminfo文件包含终端能力的信息。 Infocmp
通过infocmp程序可以对二进制的terminfo项和其它terminfo进行比较。重写terminfo说明以利用use=
terminfo字段,或以不同格式()从二进制文件(term)中打印出terminfo说明(正好和tic相反)。在所有情况中,将首先打印布尔字段,其后是数值字段,再后是串字段。
clear clear程序进行清屏操作,在相应环境下查询终端类型然后在terminfo数据库中指名如何进行清屏。
tput
tput程序利用terminfo数据库使与终端相关的能力和信息值对shell可用,初始化和重新设置终端,或返回所要求终端为类型的长名。
toe toe程序通过带描述的主名列出所有可用的终端类型。 tset
Tset程序为了能够使用终端而对它们进行初始化。现在已经不被广泛使用了。它在4.4BSD兼容的环境中可用。
--------------------------------------------------------------------------------
安装Vim Vim的安装
如果您不喜欢在您的LFS系统上安装vim作为编辑器,您可以下载并安装一个您自己喜欢的其它编辑器。在下面的网址http://archive.linuxfromscratch.org/lfs-hints/editors/您可以获得如何安装不同的编辑器的一些有益的提示信息。
要安装Vim
,vim-rt和vim-src包都需要解压。两个包的文件都需要解压到vim-5.7目录。它们不会相互覆盖任何文件,因此解包的顺序对结果没有什么影响。通过下面的命令安装Vim:
./configure --prefix=/usr && make &&
make install && cd /usr/bin && ln -s vim
vi
如果您计划在您的的LFS系统上安装X
Window系统,那么您可能会希望在安装X之后重新编译Vim。Vim有一个需要安装X和其它一些库的GUI版本编辑器。阅读Vim的文档可以获得更多的信息。
FHS遵从的提示
FHS规定象vim一类的编辑器应该使用/var/lib/<editor>作为其临时的状态文件(如临时保存的文件)。如果您希望vim遵从FHS,您应该使用这些命令集来取代上面的情形:
./configure --prefix=/usr --localstatedir=/var/lib/vim
&& make && make install && cd
/usr/bin && ln -s vim vi && mkdir
/var/lib/vim 内容 Vim包包含ctags, etags, ex, gview, gvim, rgview,
rgvim, rview, rvim, view, vim, vimtutor和xxd程序。 说明 ctags
ctags为源代码产生标签文件。 etags
etags与ctags的功能基本相同,但是它还能产生列出在一个语言文件集中找到的不同源对象交叉参考文件。 ex
ex以Ex模式vim。 gview gview是view的GUI版本。 gvim
gvim是vim的GUI版本。 rgview rgview是rview的GUI版本。 rgvim
rgvim是rvim的GUI版本。 rview
rview是view的限制版,它不能启动任何shell命令并且Vim不能被挂起。 rvim
rvim是vim的版。它不能启动任何shell命令并且Vim不能被挂起。 view
view以只读模式启动vim。 vim vim以普通的缺省方式启动vim。 vimtutor
vimtutor启动Vim说明。 xxd xxd产生一个十六进制堆或者做相反的工作。 安装GCC
GCC的安装 通过下面的命令安装GCC:
mkdir /usr/src/gccbuild
&& cd /usr/src/gccbuild &&
../gcc2.95.2.1/configure prefix=/usr \
withgxxincludedir=/usr/include/g++ \ enableshared
enablelanguages=c,c++ && make bootstrap &&
make install 内容 GCC包包含编译器、预处理程序和GNU C++库。 说明 编译器
编译器的功能是将文本格式的源代码编译成计算机能够理解的格式。源代码文件编译成目标文件后,目标代码连接器就会根据这个编译器产生的一个或多个目标文件产生一个可执行文件。
预处理程序
预处理程序或称编译预处理器实现对源代码进行编译前的预处理,例如将源代码中指定的头文件包含进来。通过头文件声明引入代码是一个节省编程时间的非常好的思想。您可以仅仅通过在代码头中插入类似#include
<filename>的代码,预处理器就可以将您指定的文件的全部内容插入到需要编译的源代码中。 C++ 库
C++库是C++程序所使用的,C++库包括C++程序中经常使用的函数,这样就可以保证程序员不必要在每次编写新的程序时都重新些某些特定的通用函数(如将文本输出到终端屏幕的函数)。
--------------------------------------------------------------------------------
安装Bison Bison的安装 通过下面的命令安装Bison: ./configure
prefix=/usr \ datadir=/usr/share/bison && make
&& make install
一些程序并不知道bison而是试图寻找yacc程序(事实上,bison是实现yacc功能的另一种也是更好的选择)。为了满足少数一些程序的需要,我们将创建一个yacc脚本,这个脚本调用bison并通过它来模仿yacc的输出文件命名惯例。
通过下面的命令创建一个新文件/usr/bin/yacc: cat > /usr/bin/yacc <<
"EOF" #!/bin/sh # Begin /usr/bin/yacc
/usr/bin/bison
-y "$@"
# End /usr/bin/yacc EOF chmod 755
/usr/bin/yacc 命令解释
--datadir=/usr/share/bison:在/usr/share/bison而不是/usr/share目录下安装bison文法文件。
内容 Bison包包含bison程序。 说明
Bison是一个解析器产生器,它是YACC的取代者。YACC表示的是又一编译程序的编译程序(Yet Another
Compiler Compiler):分析程序产生器。那么,Bison是什么呢?
它是一个产生一个分析文本文件结构的程序的程序。用户指定事物如何被连接在一起以及一个分析文本文件的程序如何被构建而不是写一个真正的程序来实现这一点。
需要结构的例子很多,比如计算器就是一个。 给定一个字符串: 1 + 2 * 3
人可以马上计算出结果是7。为什么呢?因为结构。我们的大脑知道如何解释这个字符串。但是,计算机并不知道,Bison就是一个通过将这个字串用如下方法提供给编译器以帮助计算机理解工具:
+ / \ * 1 / \ 2 3
从数的底部开始,遇到数2和3,它们通过乘法符号连接在一起,于是计算机将2和3进行乘积运算。计算结果暂时存储起来,然后计算机发现2*3的结果与数1通过加法符号连接在一起。将前面的结果再加1就得到了7。在计算过程中,无论多复杂的计算也都能够分解成树形结构,计算机只需要从底层开始,一级一级地向上计算,直到计算到最顶层就可以得到正确的答案。当然,Bison并不仅仅用于计算器。
--------------------------------------------------------------------------------
安装Less Less的安装 通过运行下面的命令安装Less: ./configure
--prefix=/usr --bindir=/bin && make && make
install
内容 Less包包含less程序。 说明
less程序是一个文件分页程序(或文本查看器)。它可以显示文件内容并支持滚屏。Less在通用分页程序(称为more)的基础上进行了改进。Less同样具有向后滚屏的能力并且当它启动时并不需要读取整个文件,这样可以使它在读取大文件时表现得更快。
安装Groff Groff的安装 通过下面的命令安装Groff: ./configure
--prefix=/usr && make && make install 内容
Groff包包含addftinfo, afmtodit, eqn, grodvi, groff, grog, grohtml,
grolj4, grops, grotty, hpftodit, indxbib, lkbib, lookbib, neqn,
nroff, pfbtops, pic, psbb, refer, soelim, tbl, tfmtodit和troff程序。
说明 addftinfo
addftinfo读取troff字体文件并且能够填加一些groff系统所使用的附加字体矩阵信息。 afmtodit
创建一个groff和grops所使用的字体文件。 eqn
eqn将嵌入troff输入文件中的方程式的描述编译成troff能够理解的命令。 grodvi
grodvi是一个为groff产生TeX dvi格式的驱动器。 groff
groff是groff文档格式化系统的前端。一般地,它运行troff程序和与选定设备相匹配的事后处理器。 grog
grog读取文件,并且猜测需要groff的哪些选项(-e, -man, -me, -mm, -ms, -p,
-s和-t)以打印文件。然后将groff命令和相应的选项打印到标准输出。 grohtml grohtml将GNU
troff的输出转换成html。 grolj4 grolj4是一个产生适合HP Laserjet
4打印机的PCL5格式输出的groff驱动器。 grops grops将GNU
troff转换成Postscript格式。 grotty grotty将GNU
troff的输出转换成适合于打字机一类设备的窗体形式。 hpftodit
hpftodit从HP标记的font矩阵文件创建一个可供“groff -Tlj4”使用的字体文件。 indxbib
indxbib对一个指定文件的参考文献数据库进行反转索引。可以用于refer、lookbib和lkbib。 lkbib
lkbib在参考文献数据库中搜索包含指定关键字的参考并且将找到的参考打印到标准输出。 lookbib
lookbib在标准错误上打印提示(除非标准输入不是终端),它从标准输入读取包含关键字集合的一行输入,然后在指定的文件的参考文献数据库中搜索包含那些关键字的参考,并将查询结果打印到标准输出。直到输入结束之前,这个过程将一直进行下去。
neqn
现在还不知道neqn是什么和它能做什么(注,理论上讲,neqn应该是nroff的预处理程序,但nroff本身就没有实现)。
nroff nroff脚本使用groff模仿nroff命令。 pfbtops
pfbtops将使用.pfb格式的Postscript字体转换成ASCII。 pic
pic将嵌入到troff或TeX输入文件中的图片描述编译成troff或TeX能够理解的命令。 psbb
psbb读取一个应该遵照文档结构惯例的Postscript文件,并在其中查找%%BoundingBox注释。 refer
refer将文件的内容拷贝到标准输出。并将.[和.]中间的行解释成引用、将.R1和.R2中间的行解释成如何处理引用的方法。
soelim soelim读取指定文件或标准输入并操作当具有.so
somefile格式的伪指令出现在输入行开头时它所指的正文内容。 tbl
tbl将嵌入到troff输入文件的格式表描述编译成troff能够理解的命令。 tfmtodit
tfmtodit创建为“groff -Tdvi”所使用的字体文件。 troff troff与Unix
troff高度兼容。它通常使用groff进行调用, groff命令同样会以合适的选项和顺序运行运行预处理器和事后处理器。
--------------------------------------------------------------------------------
安装Man Man的安装 在安装Man以前,需要解开man的补丁文件。
patch -Np1
-i ../man-1.5i.patch && ./configure -default &&
make && make install 您最好看看处理man页的格式化和压缩问题的一些提示。
内容 Man包包含man、apropos、whatis和makewhatis程序。 说明 man
man格式化并显示在线操作手册页面。 apropos
apropos搜索一个包含关键字系统命令的简短描述的数据库文件集合并在标准输出上显示。 whatis
whatis搜索一个包含关键字系统命令的简短描述的数据库文件集合并将结果在标准输出显示。仅显示完全单词匹配。
makewhatis
makewhatis读取所有的包含在给定的manpath域中的手册页或包含在给定的catpath域中的预格式化页。它为每一个页在whatis数据库中写一行。每行包含页面的名字和一个简短的说明,并通过破折号来分隔。说明是从手册页的NAME段中的内容抽取出来的。
--------------------------------------------------------------------------------
安装Perl Perl的安装 通过运行下面的命令安装Perl:
./Configure
-Dprefix=/usr && make && make install
如果您不想
回答Perl提出的那些问题。您可以通过在configure脚本中填加-d选项,这样Perl就可以使用所有的缺省设置。为了避免Configure脚本在config.sh已经创建之后仍然提出问题,您可以向perl传递-e参数。包括了这些参数的命令如下所示:
./Configure -Dprefix=/usr -d -e && make
&& make install
内容 Perl包包含Perl(Practical
Extraction and Report Language) 说明
Perl综合了C、awk、sed和sh特性和能力于一个强大的编程语言。
--------------------------------------------------------------------------------
安装M4 M4的安装 通过下面的命令安装M4:./configure --prefix=/usr
&& make && make install
如果您的基础系统运行的是2.0内核并且Glibc的版本是2.1,那么在chroot'ed环境下执行M4肯定会出问题。由于M4程序与Glibc-2.1和运行的2.0内核存在不兼容问题。如果您在chroot'ed
环境下执行m4(如安装autoconf和automake包时)遇到了麻烦您必须退出chroot'ed
环境然后静态编译M4。用这种方法将二进制文件连接到Glibc 2.0
(如果你的原有系统上运行的是2.0内核并且Glibc的版本是2.0,内核2.0和Glibc-2.1配合得不是很好)就不会再出任何问题了。
为了创建一个静态连接的M4版本,执行下面的命令: logout cd
$LFS/usr/src/m4-1.4 ./configure --prefix=/usr make
LDFLAGS=-static make prefix=$LFS/usr install
现在您可以重新进入chroot'ed环境,并且开始安装下一个程序包了。如果M4还是动态重编译的,您可以通过重新引导进入LFS系统而不是通过chroot进入LFS环境。的方法完成上面的工作
chroot $LFS /usr/bin/env i HOME=/root \ TERM=$TERM
/bin/bash login 内容 M4包包含M4处理器 说明
M4是一个宏处理程序。它将输入拷贝到输出并将宏进行扩张。宏或者是内置的或者是用户定义的并且可以带任意数量的参数。除了仅仅可以进行宏扩张之外,m4具有可以包括命名文件的内置函数、运行UNIX命令、进行整数数值运算、以不同的方式操作文本递归等等功能。M4既可以用作编译器的前端,又可以象其本来的那样作为一个宏处理器使用。
--------------------------------------------------------------------------------
安装Texinfo Texinfo的安装 通过下面的命令安装Texinfo: ./configure
--prefix=/usr && make && make install
&& make TEXMF=/usr/share/texmf install-tex 内容
Texinfo包包含info、install-info、makeinfo、texi2dvi和texindex程序。 说明
info
info程序读取Info文档(通常在/usr/doc/info目录下)。Info文档类似于man(ual)页,同仅仅解释程序的选项的man相比,info试图解释一些更深入的知识。
install-info
install-info程序更新info的条目。当运行info程序时,应该为其提供一个可用的主题列表。install-info就是用来维护主题列表的程序,如果info文件被手工删除了,那么也一定要在索引文件中删除相应的主题。install-info程序就是为了这个目的而设计的。当填加info文档时,这个程序同样可用。
makeinfo
makeinfo程序将Texinfo源文档翻译成不同的格式,可用的格式包括:info文件,纯文本和HTML。
texi2dvi texi2dvi程序打印Texinfo文档。 texindex
texindex程序用于分类Texinfo索引文件。
安装Autoconf Autoconf的安装
通过下面的命令安装Autoconf:
./configure --prefix=/usr &&
make && make install
内容
Autoconf包包含autoconf, autoheader, autoreconf, autoscan,
autoupdate和ifnames程序。 说明 autoconf
Autoconf是一个产生可以自动配置源代码包以适应多种类UNIX系统的shell脚本的工具。Autoconf
产生的配置脚本在运行时独立于Autoconf ,因此使用这些脚本的用户不需要安装Autoconf。 autoheader
autoheader程序能够产生一个用于配置的C #define语句模板文件。 autoreconf
如果有很多Autoconf产生的配置文件,autoreconf可以保存一些工作,它通过重复运行autoconf(以及在合适的地方运行autoheader)以重新产生Autoconf配置脚本和配置头模板,这些文件保存在以当前目录为根的目录树中。
autoscan
autoscan程序可以用来为软件包创建configure.in文件。Autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以当前目录为根)的目录树中检查源文件。它为通常的轻便问题搜索源文件,并且为那个包创建一个configure.scan文件,这个文件就是configure.in的前身。
autoupdate autoupdate程序将一个调用Autoconf
宏的旧名称的configure.in文件中的宏更新为新的名称。 ifnames 当为一个软件包写configure.in
时,ifnames可以给一些帮助。它打印包中那些在C预处理器中已经使用了的表示符。如果一个包已经设置成具有某些可移植属性,这个程序能够帮助指出它的配置应该如何检查。它可以用来填补由autoscan产生的configure.in中的隔阂。
安装Automake Automake的安装 通过下面的命令安装Automake:
./configure --prefix=/usr && make install
内容
Automake包包含aclocal和automake程序。 说明 aclocal
Automake包括一定数量的可以用于打包的Autoconf宏;其中一些是Automake在某些情况下真正需要的。这些宏必须在aclocal.m4文件中定义。否则autoconf就看不到它们。
Aclocal程序会根据configure.in的内容自动产生aclocal.m4文件,这就为获得Automake提供的宏提供了一个方便的方法,这种方法不必到处搜索。Aclocal机制也可以扩展到其它包的应用中。
automake
要为一个包建立所有的Makefile.in文件,通过在目录的顶层以没有参数的形式运行automake程序。Automake会自动找到每一个合适的Makefile.am
(通过扫描configure.in)并且产生相应的Makefile.in。
--------------------------------------------------------------------------------
安装Bash Bash的安装 通过下面的命令安装Bash: ./configure
--prefix=/usr --with-curses && make && make
install && logout
静态bash被动态bash所取代,然后通过下面的命令重新进入chroot'ed环境: mv
$LFS/usr/bin/bash $LFS/usr/bin/bashbug $LFS/bin &&
chroot $LFS /usr/bin/env i HOME=/root \ TERM=$TERM /bin/bash
login 内容 Bash包包含bash程序。 说明 Bash是Bourne-Again
Shell的缩写,它在UNIX系统中作为命令行解释器被广泛使用。
Bash是一个从标准输入——键盘——中读取命令的程序。用户敲击一个命令,这个程序读取这些命令并且根据命令进行相应的操作(比如运行一个程序)。
--------------------------------------------------------------------------------
安装Flex Flex的安装 通过下面的命令安装Flex: ./configure
--prefix=/usr && make && make install
&& cd /usr/bin && ln -s flex lex 内容
Flex包包含flex程序。 说明
Flex是一种编制在文本中识别模式的程序的工具。模式识别在许多应用中非常有用。用户设定查找的规则,flex将编制一套查找那些模式的程序。人们使用flex的原因就是设定查找规则远比为查找文本资料现写程序要容易。
--------------------------------------------------------------------------------
安装File File的安装 通过运行下面的命令安装File:
./configure
--prefix=/usr --datadir=/usr/share/misc && make
&& make install File使用幻数(magic
number)以确定文件的类型。这些幻数保存在一个纯文本文件中同File一起提供。每次运行时,File内部编译这个数据库。由于每次都编译文件并不是实现这个目的最快捷方式,所以它并不是File的正规操作。File提供一个“-C”选项以编译这个幻数文件。这个操作没有自动完成的理由是一些人喜欢在幻数上做点文章。另一方面,许多人并不知道它们将要编译的是幻数文件,因此当使用纯文本的幻数文件时,File的作者加入了一个警告。由于我们不是经常在纯文本的幻数文件上做工作,我们编译这个文件,由于它表现得更快,并且避开了讨厌的警告信息:
file -C
内容 File包包含file程序。 说明
File测试每一个指定的文件并且试图对它们进行分类。有三个测试集,按照下面的顺序执行:文件系统测试、幻数测试和语言测试。第一个测试成功后会打印文件文件类型。 |