📄 0520source_code_and_tarball.htm
字号:
<table class="term"><tr><td class="term"><pre>
<span class=term_hd># 1. 先建立编译的规则</span>
[root@linux ~]# <span class=term_command>vi makefile</span>
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
<span class=term_write>clean:
rm -f main main.o haha.o sin_value.o cos_value.o</span>
<span class=term_hd># 2. 测试看看∶</span>
[root@linux ~]# <span class=term_command>make clean</span>
rm -rf main main.o haha.o sin_value.o cos_value.o
</pre></td></tr></table>
如此一来,我们的 makefile 里面就具有至少两个标的,分别是
main 与 clean ,如果我们想要建立 main 的话,输入『<span class=text_import1>make
main</span>』,如果想要清除有的没的,输入『<span class=text_import1>make
clean</span>』即可啊!而如果想要先清除目标档再编译
main 这个程式的话,就可以这样输入∶『make clean main』,如下所示∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>make clean main</span>
rm -rf main main.o haha.o sin_value.o cos_value.o
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o sin_value.o sin_value.c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
</pre></td></tr></table>
这样就很清楚了吧!?但是,您是否会觉得,咦!
makefile 里面怎么重复的资料这么多啊!呵呵!没错!所以我们可以再藉由 shell
script 那时学到的『变数』来更简化 makefile 喔∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi makefile</span>
<span class=term_write>LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}</span>
</pre></td></tr></table>
与 bash shell script 的语法有点不太相同,变数的基本语法为∶<ol><span class=text_import2>
<li>变数与变数内容以『=』隔开,同时两边可以具有空格;
<li>变数左边不可以有 <tab> ,例如上面范例的第一行 LIBS 左边不可以是 <tab>;
<li>变数与变数内容在『=』两边不能具有『:』;
<li>在习惯上,变数最好是以『大写字母』为主;
<li>运用变数时,以 ${变数} 或 $(变数) 使用;
<li>在该 shell 的环境变数是可以被套用的,例如提到的 CFLAGS 这个变数!
<li>在指令列模式也可以给予变数。</ol></span>
由于 <span class=text_import2>gcc 在进行编译的行为时,会主动的去读取 CFLAGS
这个环境变数</span>,所以,您可以直接在 shell 定义出这个环境变数,也可以在
makefile 档案里面去定义,更可以在指令列当中给予这个咚咚呢!例如∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>CFLAGS="-Wall" make clean main</span>
<span class=term_say># 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变数内容!</span>
</pre></td></tr></table>
也可以这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi makefile</span>
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
<span class=term_write>CFLAGS = -Wall</span>
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
</pre></td></tr></table>
咦!我可以利用指令列进行环境变数的输入,也可以在档案内直接指定环境变数,那万一这个
CFLAGS 的内容在指令列与 makefile 里面并不相同时,以那个方式输入的为主?呵呵!
环境变数取用的规则是这样的∶<ol><span class=text_import2>
<li>make 指令列后面加上的环境变数为优先;
<li>makefile 里面指定的环境变数第二;
<li>shell 原本具有的环境变数第三。</ol></span>
此外,还有一些特殊的变数需要了解的喔∶<ul><span class=text_import2>
<li>$@∶代表目前的标的(target)</ul></span>
所以我也可以将 makefile 改成∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi makefile</span>
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
<span class=term_write>gcc -o $@ ${OBJS} ${LIBS}</span> <span class=term_note><==那个 $@ 就是 main !</span>
clean:
rm -f main ${OBJS}
</pre></td></tr></table>
这样是否稍微了解了 makefile ( 也可能是 Makefile
) 的基本语法?这对于您未来自行修改原始码的编译规则时,是很有帮助的喔!^_^!
</div>
</div>
<hr><a NAME="tarball"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class=text_h1>Tarball 的管理与建议∶</span>
<div class=block1>
好了!在我们知道了原始码的相关资讯之后,再来要了解的自然就是如何使用具有原始码的
Tarball 来建立一个属于自己的套件棉!从前面几个小节的说明当中,我们晓得<span class=text_import2>其实
Tarball 的安装是可以跨平台的,因为 C 语言的程式码在各个平台上面是可以共通的</span>,
只是需要的编译器可能并不相同而已。例如
Linux 上面用 gcc 而 Windows 上面也有相关的 C 编译器啊~所以呢,同样的一组原始码,既可以在
Fedora Linux 上面编译,也可以在 SuSE Linux 上面编译,当然,也可以在大部分的
Unix 平台上面编译成功的!<br><br>
所以棉, Tarball 原始码程式应该可以在大部分的环境底下安装成功的!举例来说,鸟哥在上面几个小节所提供的
C 程式是在 Fedora Core 4 及 Red Hat 9 上面测试编译的,那么您可以下载之后在自己的 Linux
环境下测试看看,我想,每个人应该都可以顺利的编译成功的才是!因为
C 的语法是没有不一样的啊! ^_^<br><br>
如果万一没有编译成功怎么办?很简单啊,透过修改小部分的程式码( 通常是因为很小部分的异动而已
)就可以进行跨平台的移植了!也就是说,刚刚我们在 Linux 底下写的程式『<span class=text_import2>理论上,是可以在
Windows 上面编译的</span>!』这就是原始码的好处啦!所以说,如果朋友们想要学习程式语言的话,
鸟哥个人是比较建议学习『<span class=text_import1>具有跨平台能力的程式语言</span>』,例如
C 就是很不错的一个!<br><br>
唉啊!又扯远了~赶紧拉回来继续说明我们的 Tarball 啦!<br><br>
<hr><a NAME="tarball_pack"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>使用原始码管理套件所需要的基础套件</span>
<div class=block2>
从原始码的说明我们晓得要制作一个 binary
执行档需要很多咚咚的呢!这包括底下这些基础的套件∶<ul>
<li><span class=text_import1>gcc 或 cc 等 C 语言编译器( compiler )∶</span><br>
这是一定要的啦!要将原始码编译成为可执行的 binary
才行,所以当然就需要编译器棉!在 Linux 上面用的当然就是 GNU 发展的 gcc
这个超好用的免费的 C 编译器啦!并且,很多在 Linux 平台上面发展的套件的原始码,原本就是以
gcc 为底来设计的呢。</li><br>
<li><span class=text_import1>make 及 autoconfig 等套件∶</span><br>
一般来说,以 Tarball 方式释出的套件当中,为了简化编译的行程,通常都是配合前几个小节提到的
make 这个指令来依据目标档案的相依性而进行编译。但是我们也知道说 make 需要
makefile 这个档案的规则,那由于不同的系统里面可能具有的基础套件环境并不相同,
所以就需要侦测使用者的作业环境,好自行建立一个
makefile 档案。这个自行侦测的小程式也必须要藉由 autoconfig 这个相关的套件来辅助才行。</li><br>
<li><span class=text_import1>需要 Kernel 提供的 Library 以及相关的 Include 档案∶</span><br>
从前面的原始码编译过程,我们晓得函式库( library )的重要性,同时也晓得有
include 档案的存在。很多的套件在发展的时候都是直接取用系统核心提供的函式库与
include 档案的,这样才可以与这个作业系统相容啊!尤其是在『
<span class=text_import2>驱动程式方面的套件</span> 』,例如网路卡、音效卡、USB
等驱动程式在安装的时候,常常是需要核心提供的相关资讯的。在 Red Hat
的系统当中 ( 包含 Fedora 等系列 ) ,这个核心相关的功能通常都是被包含在
<span class=text_import2>kernel-source</span>
或 <span class=text_import2> kernel-header</span> 这些套件名称当中,所以记得要安装这些套件喔!
</li></ul>
虽然 Tarball 的安装上面相当的简单,如同我们前面几个小节的例子,只要顺著开发商提供的
README 与 INSTALL 档案所载明的步骤来进行,安装是很容易的。但是我们却还是常常会在
BBS 或者是新闻群组当中发现这些留言∶『我在执行某个程式的侦测档案时,他都会告诉我没有
gcc 这个套件,这是怎么回事?』还有∶『我没有办法使用 make 耶!这是什么问题?』呵呵!
这就是没有安装上面提到的那些基础套件啦!<br><br>
咦!为什么使用者不安装这些套件啊?呵呵!这是因为目前的 Linux distribution
大多已经偏向于桌上型电脑的使用,他们希望使用者能够按照厂商自己的希望来安装相关的套件即可,
所以通常『预设』是没有安装
gcc 或者是 make 等套件的。所以啦,<span class=text_import2>如果您希望未来可以自行安装一些以
Tarball 方式释出的套件时,记得请自行挑选想要安装的套件名称喔</span>!例如在
Fedora 或者是 Red Hat 当中记得选择 <span class=text_import2>Software Development</span>
以及 <span class=text_import2>Kernel Source Development</span> 等相关字眼的群集呢。<br><br>
<span class=text_import2>那万一我已经安装好一部 Linux 主机,但是使用的是预设值所安装的套件,所以没有
make, gcc 等咚咚,该如何是好</span>?呵呵!问题其实不大啦,目前使用最广泛的 Fedora
或者是 Red Hat 大多是以 RPM ( 下一章会介绍 ) 来安装套件的,所以,您只要拿出当初安装
Linux 时的原版光碟,然后以下一章介绍的 RPM 来一个一个的加入到您的 Linux
主机里面就好啦!很简单的啦!<br><br>
</div>
<hr><a NAME="tarball_step"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>Tarball 安装的基本步骤</span>
<div class=block2>
我们提过以 Tarball 方式释出的套件是需要重新编译可执行的
binary file 的。而 Tarball 是以 tar 这个指令来打包与压缩的档案,所以啦,当然就需要先将
Tarball 解压缩,然后到原始码所在的目录下进行 makefile 的建立,再以 make
来进行编译与安装的动作啊!所以整个安装的基础动作大多是这样的∶<ol><span class=text_import2>
<li>将 tarball 档案在 /usr/local/src 目录下解压缩;
<li>进入新建立的目录底下,去查阅 INSTALL 与 README 等相关档案内容( 很重要的步骤! );
<li>根据 INSTALL/README 的内容察看并安装好一些相依的套件( 非必要 );
<li>以自动侦测程式( configure 或 config )侦测作业环境,并建立 Makefile 这个档案;
<li>以 make 这个程式并使用该目录下的 Makefile 做为他的参数设定档,来进行 make ( 编译或其他 )的动作;
<li>以 make 这个程式,并以 Makefile 这个参数设定档,依据
install 这个标的( target )的指定来安装到正确的路径!</ol></span>
注意到上面的第二个步骤,通常在每个软体在释出的时候,都会附上
INSTALL 或者是 README 这种档名的说明档,这些说明档请『<span class=text_import2>确实详细的</span>』
阅读过一遍,通常这些档案会记录这个软体的安装要求、软体的工作项目、
与软体的安装参数设定及技巧等,只要仔细的读完这些档案,基本上,要安装好
tarball 的档案,都不会有什么大问题棉。至于 makefile 在制作出来之后,里头会有相当多的标的(
target ),最常见
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -