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

📄 0520source_code_and_tarball.htm

📁 鸟哥的linux私房菜
💻 HTM
📖 第 1 页 / 共 5 页
字号:
	</div>

	<hr><a NAME="intro_howto"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>如何安装与升级套件</span>
	<div class=block2>
		将原始码作了一个简单的介绍,也知道了系统其实认识的可执行档是
		binary file 之后,好了,得要聊一聊,那么怎么安装与升级一个 Tarball 
		的套件?为什么要安装一个新的套件呢?当然是因为我们的主机上面没有该套件棉!那么,
		为何要升级呢?!原因可能有底下这些∶<ul><span class=text_import2>
		<li>需要新的功能,但旧有主机的旧版套件并没有,所以需要升级到新版的套件;
		<li>旧版本的套件上面可能有安全上的顾虑,所以需要更新到新版的套件;
		<li>旧版的套件执行效能不彰,或者执行的能力不能让管理者满足。</ul></span>

		在上面的需求当中,尤其需要注意的是第二点,当一个套件有安全上的顾虑时,千万不要怀疑,
		赶紧更新套件吧!否则造成网路危机,那可不是闹著玩的!那么更新的方法有哪些呢?
		基本上更新的方法可以分为两大类,分别是∶<ul><span class=text_import2>
		<li>直接以原始码透过编译来安装与升级;
		<li>直接以编译好的 binary file 来安装与升级。</ul></span>

		上面第一点很简单,就是直接以 Tarball 在自己的机器上面进行侦测、编译、
		安装与设定等等动作来升级就是了。不过,这样的动作虽然让使用者在安装过程当中具有很高的弹性,
		但毕竟是比较麻烦一点,如果
		Linux distribution 厂商能够针对自己的作业平台先进行编译等过程,再将编译好的
		binary file 释出的话,那由于我的系统与该 Linux distribution 的环境是相同的,所以他所释出的
		binary file 就可以在我的机器上面直接安装啦!省略了侦测与编译等等繁杂的过程呢!<br><br>

		目前很多 binary file 升级的机制呢,包括有 <span class=text_import2>Red Hat 系统
		( 含 Fedora 系列 ) 发展的 RPM
		与 up2date, yum 等线上更新模式;Mandrake 的 urpmi 套件更新方式; Debian
		使用的 dpkg ; Sun Unix 使用的 pkg ,以及目前很流行的 apt 线上更新模式等等</span>,
		以使用率来说,目前最传统的是以
		Tarball 直接进行编译的安装与升级,而另一个则是以 RPM 相关的机制来进行安装与升级棉!本章节主要针对
		Tarball ,至于 RPM 则留待下个章节再来介绍呢!<br><br>

		好了,那么一个套件的 Tarball 是如何安装的呢?基本流程是这样的啦∶<ol><span class=text_import2>
		<li>将 Tarball 由厂商的网页下载下来;
		<li>将 Tarball 解开,产生很多的原始码档案;
		<li>开始以 gcc 进行原始码的编译( 会产生目标档 object files );
		<li>然后以 gcc 进行函式库、主、副程式的连结,以形成主要的 binary file;
		<li>将上述的 binary file 以及相关的设定档安装至自己的主机上面。</ol></span>

		上面第 3, 4 步骤当中,我们可以透过 make 这个指令的功能来简化他,
		所以整个步骤其实是很简单的啦!只不过您就得需要至少有
		gcc 以及 make 这两个套件在您的 Linux 系统里面才行喔!
		详细的过程以及需要的套件我们在后面的章节继续来介绍的啦!
	</div>
</div>


<hr><a NAME="simple_ex"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class=text_h1>一个简单的范例∶</span>
<div class=block1>
	经过上面的介绍之后,您应该比较清楚的知道原始码、编译器、函式库与执行档之间的相关性了。
	不过,详细的流程可能还是不很清楚,所以,在这里我们以一个简单的程式范例来说明整个编译的过程喔!赶紧进入
	Linux 系统,实地的操作一下底下的范例呢!<br><br>

	<hr><a NAME="simple_ex_hello"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>印出 Hello World</span>
	<div class=block2>
		我们以 Linux 上面最常见的 C 语言来撰写第一支程式!第一支程式最常作的就是.....
		在萤幕上面印出『<span class=text_import2>Hello World!</span>』的字样~当然,
		这里我们是以简单的 C 语言来撰写,如果您对于
		C 有兴趣的话,那么请自行购买相关的书籍喔! ^_^好了,不棉唆,立刻编辑第一支程式吧!
		( <span class=text_vbird>请先确认您的 Linux 系统里面已经安装了 gcc 了喔!如果尚未安装 
		gcc 的话,请先参考下一节的 RPM 安装法,先安装好 gcc 之后,再回来阅读本章</span> )<br>

<table class="term"><tr><td class="term"><pre>
<span class=term_hd># 1. 先编辑原始码∶</span>
[root@linux ~]# <span class=term_command>vi hello.c</span>   <span class=term_note>&lt;==注意一下, C 语言用 .c 的附档名</span>
<span class=term_write>#include &lt;stdio.h>
int main(void)
{
        printf("Hello World\n");
}</span>

<span class=term_say># 上面是 C 语言的语法,那个第一行的 # 并不是注解喔!如果您担心
# 输入错误,请到底下的连结下载这个档案∶
# <a href="http://linux.vbird.org/linux_basic/0520source/hello.c">http://linux.vbird.org/linux_basic/0520source/hello.c</a>
</span>
<span class=term_hd># 2. 开始将原始码编译成为可执行的 binary file ∶</span>
[root@linux ~]# <span class=term_command>gcc hello.c</span>
<span class=term_say># 这个时候,在本目录下会产生一个名为 a.out 的执行档!
# 在预设的状态下,如果我们直接以 gcc 编译原始码,并且没有加上
# 任何参数,则 <span class=term_note_b>执行档的档名会被自动设定为 a.out 这个档案名称</span>!</span>

<span class=term_hd># 3. 执行一下这个档案∶</span>
[root@linux ~]# <span class=term_command>./a.out</span>
Hello World  <span class=term_note>&lt;==呵呵!成果出现了!</span>
</pre></td></tr></table>

		好了,上面的例子很简单吧!那个 hello.c 就是原始码,而
		gcc 就是编译器,至于 a.out 就是编译成功的可执行 binary file 棉!咦!如果我想要产生目标档(
		object file )来进行其他的动作( <span class=text_vbird>在较大的套件当中,
		就需要使用多个目标档来进行相关的连结</span>),而且执行档的档名也不要用预设的
		a.out ,那该如何是好?可以将上面的第 2 个步骤改成这样∶<br>

<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>gcc -c hello.c</span>
<span class=term_say># 会产生一个名为 hello.o 的目标档,object file 的附档名为 *.o 喔!</span>

[root@linux ~]# <span class=term_command>gcc -o hello hello.o</span>
<span class=term_say># 这个步骤是利用 hello.o 这个目标档制作出一个名为 hello 的执行档
# 详细的 gcc 语法我们会在后续章节中继续介绍!
# 透过这个动作后,我们可以得到 hello 及 hello.o 两个档案,
# 真正可以执行的是 hello 这个 binary file 喔!</span>

<span class=term_hd># 3. 执行一下这个档案∶</span>
[root@linux ~]# <span class=term_command>./hello</span>
Hello World
</pre></td></tr></table>

		或许您会觉得,咦!只要一个动作作出 a.out 就好了,干嘛还要先制作目标档再做成执行档呢?!
		呵呵!透过下个范例,您就可以知道为什么啦!<br><br>
	</div>

	<hr><a NAME="simple_ex_function"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>副程式的编译</span>
	<div class=block2>
		如果我们在一个主程式里面又呼叫了另一个副程式呢!?这是很常见的一个程式写法,
		因为可以简化整个程式的易读性!在底下的例子当中,我们以
		thanks.c 这个主程式去呼叫 thanks_2.c 这个副程式,写法很简单∶<br>

<table class="term"><tr><td class="term"><pre>
<span class=term_hd># 1. 先编辑原始码 thanks.c 与 thanks_2.c∶</span>
[root@linux ~]# <span class=term_command>vi thanks.c</span>
<span class=term_write>#include &lt;stdio.h>
int main(void)
{
        printf("Hello World\n");
        thanks_2();
}</span>
<span class=term_say># 上面的 thanks_2(); 那一行就是呼叫副程式啦!</span>

[root@linux ~]# <span class=term_command>vi thanks_2.c</span>
<span class=term_write>void thanks_2(void)
{
        printf("Thank you!\n");
}</span>
<span class=term_say># 上面这两个档案您可以到底下下载∶
# <a href="http://linux.vbird.org/linux_basic/0520source/thanks.c">http://linux.vbird.org/linux_basic/0520source/thanks.c</a>
# <a href="http://linux.vbird.org/linux_basic/0520source/thanks_2.c">http://linux.vbird.org/linux_basic/0520source/thanks_2.c</a>
</span>
<span class=term_hd># 2. 开始将原始码编译成为可执行的 binary file ∶</span>
[root@linux ~]# <span class=term_command>gcc -c thanks.c thanks_2.c</span>
<span class=term_say># 产生了两个目标档!且编译过程里面可能会产生一些 warning (警告) 的讯息,
# 因为仅是警告而已,所以该讯息你可以先略过去不打紧的! ^_^</span>
[root@linux ~]# <span class=term_command>gcc -o thanks thanks.o thanks_2.o</span>

<span class=term_hd># 3. 执行一下这个档案∶</span>
[root@linux ~]# <span class=term_command>./thanks</span>
Hello World
Thank you!
</pre></td></tr></table>

		知道为什么要制作出目标档了吗?!由于我们的原始码档案有时并非仅只有一个档案,
		所以我们无法直接进行编译。这个时候就需要先产生目标档,然后再以连结制作成为
		binary 可执行档。另外,<span class=text_import2>如果有一天,您更新了
		thanks_2.c 这个档案的内容,则您只要重新编译 thanks_2.c 来产生新的 thanks_2.o
		,然后再以连结制作出新的 binary 可执行档即可!而不必重新编译其他没有更动过的原始码档案</span>。
		这对于软体开发者来说,是一个很重要的功能,因为有时候要将偌大的原始码全部编译完成,
		会花很长的一段时间呢!<br><br>

		此外,如果您想要让程式在执行的时候具有比较好的效能,或者是其他的除错功能时,
		可以在编译的过程里面加入适当的参数,例如底下的例子∶<br>

<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>gcc -O -c thanks.c thanks_2.c</span>
<span class=term_say># -O 为产生最佳化的参数</span>

[root@linux ~]# <span class=term_command>gcc -Wall -c thanks.c thanks_2.c</span>
thanks.c: In function 'main':
thanks.c:5: warning: implicit declaration of function 'thanks_2'
thanks.c:6: warning: control reaches end of non-void function
thanks_2.c: In function 'thanks_2':
thanks_2.c:3: warning: implicit declaration of function 'printf'
thanks_2.c:3: warning: incompatible implicit declaration of built-in function 'printf'
<span class=term_say># -Wall 为产生更详细的编译过程资讯。上面的讯息为警告讯息( warning )
# 所以不用理会也没有关系!</span>
</pre></td></tr></table>

		至于更多的 gcc 额外参数功能,就得要 man gcc 棉~呵呵!可多的跟天书一样~<br><br>
	</div>

	<hr><a NAME="simple_ex_lib"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>加入连结的函式库</span>
	<div class=block2>
		刚刚我们都仅只是在萤幕上面印出一些字眼而已,如果说要计算数学公式呢?!
		例如我们想要计算出三角函数里面的
		sin(90度角),要注意的是,大多数的程式语言都是使用径度而不是一般我们在计算的『角度』,
		180 度角约等于 3.14 径度!嗯!那我们就来写一下这个程式吧!<br>

<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi sin.c</span>
<span class=term_write>#include &lt;stdio.h>
int main(void)
{
        float value;
        value = sin ( 3.14 / 2 );
        printf("%f\n",value);
}</span>
<span class=term_say># 上面这个档案的内容可以在底下取得!
# <a href="http://linux.vbird.org/linux_basic/0520source/sin.c">http://linux.vbird.org/linux_basic/0520source/sin.c</a></span>

⌨️ 快捷键说明

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