📄 0520source_code_and_tarball.htm
字号:
<br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -c hello.c</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># 会产生一个名为hello.o 的目标文件,object file 的附档名为 *.o 喔!</font><br><font size="-1" color="#ffffff" face="SimSun"> </font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -o hello hello.o</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># 这个步骤是利用hello.o 这个目标文件制作出一个名为 hello 的执行档</font><br><font size="-1" color="#ff6666" face="SimSun"># 详细的 gcc语法我们会在后续章节中继续介绍!</font><br><font size="-1" color="#ff6666" face="SimSun"># 透过这个动作后,我们可以得到hello 及 hello.o 两个档案,</font><br><font size="-1" color="#ff6666" face="SimSun"># 真正可以执行的是hello 这个 binary file 喔!</font><br><font size="-1" color="#ffffff" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 3. 执行一下这个档案:</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">./hello</font></b></font><br><font size="-1" color="#ffffff" face="SimSun">Hello World</font></td></tr></tbody></table><font color="#000000">  </font><br><font color="#000000">或许您会觉得,咦!只要一个动作作出 a.out 就好了,干嘛还要先制作目标文件再做成执行档呢?!呵呵!透过下个范例,您就可以知道为什么啦!</font></blockquote><hr width="100%"><a name="simple_ex_function"></a><img src="0520source_code_and_tarball_files/penguin-s.gif" nosave="" align="middle" height="23" width="17"><font color="#000099">子程序的编译</font><blockquote>如果我们在一个主程序里面又呼叫了另一个子程序呢!?这是很常见的一个程序写法,因为可以简化整个程序的易读性!在底下的例子当中,我们以thanks.c 这个主程序去呼叫 thanks_2.c 这个子程序,写法很简单:<br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" color="#cccccc" face="SimSun"># 1. 先编辑原始码thanks.c 与 thanks_2.c:</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">vi thanks.c</font></b></font><br><font size="-1" color="#ffff00" face="SimSun">#include <stdio.h></font><br><font size="-1" color="#ffff00" face="SimSun">int main(void)</font><br><font size="-1" color="#ffff00" face="SimSun">{</font><br><font size="-1" color="#ffff00" face="SimSun">       printf("Hello World\n");</font><br><font size="-1" color="#ffff00" face="SimSun">       thanks_2();</font><br><font size="-1" color="#ffff00" face="SimSun">}</font><br><font size="-1" color="#ffffff" face="SimSun"> </font><br><font size="-1" face="SimSun"><font color="#ff6666"># 上面的 </font><font color="#ffccff">thanks_2();</font><font color="#ff6666">那一行就是呼叫子程序啦!</font></font><p><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">vi thanks_2.c</font></b></font><br><font size="-1" color="#ffff00" face="SimSun">void thanks_2(void)</font><br><font size="-1" color="#ffff00" face="SimSun">{</font><br><font size="-1" color="#ffff00" face="SimSun">       printf("Thank you!\n");</font><br><font size="-1" color="#ffff00" face="SimSun">}</font><br><font size="-1" color="#ffff00" face="SimSun"> </font><br><font size="-1" color="#ff6666" face="SimSun"># 上面这两个档案您可以到底下下载</font><br><font size="-1" color="#ff6666" face="SimSun"># <a href="http://linux.vbird.org/download/books/basic/source_code/thanks.c">http://linux.vbird.org/download/books/basic/source_code/thanks.c</a></font><br><font size="-1" color="#ff6666" face="SimSun"># <a href="http://linux.vbird.org/download/books/basic/source_code/thanks_2.c">http://linux.vbird.org/download/books/basic/source_code/thanks_2.c</a></font><br><font size="-1" color="#ffffff" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 2. 开始将原始码编译成为可执行的binary file :</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -c thanks.c thanks_2.c</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># 产生了两个目标文件!</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -o thanks thanks.o thanks_2.o</font></b></font><br><font size="-1" color="#ffffff" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 3. 执行一下这个档案:</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">./thanks</font></b></font><br><font size="-1" color="#ffffff" face="SimSun">Hello World</font><br><font size="-1" color="#ffffff" face="SimSun">Thank you!</font></p></td></tr></tbody></table><font color="#000000">  </font><br><font color="#000000">知道为什么要制作出目标文件了吗?!由于我们的原始码档案有时并非仅只有一个档案,所以我们无法直接进行编译。这个时候就需要先产生目标文件,然后再以连结制作成为binary 可执行档。另外,</font><font color="#000066">如果有一天,您更新了thanks_2.c 这个档案的内容,则您只要重新编译 thanks_2.c 来产生新的 thanks_2.o,然后再以连结制作出新的 binary 可执行档即可!而不必重新编译其它没有更动过的原始码档案</font><font color="#000000">。这对于软件开发者来说,是一个很重要的功能,因为有时候要将诺大的原始码全部编译完成,会花很长的一段时间呢!</font><br><font color="#000000"> </font><br><font color="#000000">此外,如果您想要让程序在执行的时候具有比较好的效能,或者是其它的除错功能时,可以在编译的过程里面加入适当的参数,例如底下的例子:</font><br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -O -c thanks.c thanks_2.c</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># -O 为产生最佳化的参数</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -Wall -c thanks.c thanks_2.c</font></b></font><br><font size="-1" color="#ffffff" face="SimSun">thanks.c: Infunction `main':</font><br><font size="-1" color="#ffffff" face="SimSun">thanks.c:5:warning: implicit declaration of function `thanks_2'</font><br><font size="-1" color="#ffffff" face="SimSun">thanks.c:6:warning: control reaches end of non-void function</font><br><font size="-1" color="#ffffff" face="SimSun">thanks_2.c:In function `thanks_2':</font><br><font size="-1" color="#ffffff" face="SimSun">thanks_2.c:3:warning: implicit declaration of function `printf'</font><br><font size="-1" color="#ff6666" face="SimSun"># -Wall 为产生更详细的编译过程信息。上面的讯息为警告讯息(warning )</font><br><font size="-1" color="#ff6666" face="SimSun"># 所以不用理会也没有关系!</font></td></tr></tbody></table><font color="#000000">  </font></blockquote><hr width="100%"><a name="simple_ex_lib"></a><img src="0520source_code_and_tarball_files/penguin-s.gif" nosave="" align="middle" height="23" width="17"><font color="#000099">加入连结的函式库</font></ul><blockquote><blockquote>刚刚我们都仅只是在屏幕上面印出一些字眼而已,如果说要计算数学公式呢?!例如我们想要计算出三角函数里面的sin(90度角),要注意的是,大多数的程序语言都是使用径度而不是一般我们在计算的『角度』,180 度角约等于 3.14 径度!嗯!那我们就来写一下这个程序吧!<br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">vi sin.c</font></b></font><br><font size="-1" color="#ffff00" face="SimSun">#include <stdio.h></font><br><font size="-1" color="#ffff00" face="SimSun">int main(void)</font><br><font size="-1" color="#ffff00" face="SimSun">{</font><br><font size="-1" color="#ffff00" face="SimSun">       float value;</font><br><font size="-1" color="#ffff00" face="SimSun">       value = sin ( 3.14 / 2 );</font><br><font size="-1" color="#ffff00" face="SimSun">       printf("%f\n",value);</font><br><font size="-1" color="#ffff00" face="SimSun">}</font><br><font size="-1" color="#ff6666" face="SimSun"># 上面这个档案的内容可以在底下取得!</font><br><font size="-1" color="#ff6666" face="SimSun"># <a href="http://linux.vbird.org/download/books/basic/source_code/sin.c">http://linux.vbird.org/download/books/basic/source_code/sin.c</a></font></td></tr></tbody></table><font color="#000000">  </font><br><font color="#000000">那要如何编译这支程序呢?我们先直接编译看看:</font><br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc sin.c</font></b></font><br><font size="-1" color="#ffffff" face="SimSun">/tmp/ccppUCx8.o(.text+0x1e):In function `main':</font><br><font size="-1" color="#ffffff" face="SimSun">: <b>undefinedreference to `sin'</b></font><br><font size="-1" color="#ffffff" face="SimSun">collect2: ldreturned 1 exit status</font></td></tr></tbody></table><font color="#000000">  </font><br><font color="#000000">特别注意上面的说明,唉啊!怎么没有编译成功?它说的是『</font><font color="#000066">undefinedreference to sin</font><font color="#000000">』,说的是『</font><font color="#000066">没有sin 的相关定义参考值!</font><font color="#000000">』,为什么会这样呢?这是因为C 语言里面的 sin 函示是写在 libm.so 这个函式库中,而我们并没有在原始码里面加入相关的说明,所以当然就需要在编译与连结的时候将这个函式库给他连结进执行档里面啊!所以我们可以这样做:</font><br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc sin.c -lm -L/lib -L/usr/lib</font></b></font><br><font size="-1" color="#ffccff" face="SimSun"># 特别注意,那个-lm 可以拆开成两部份来看,</font><br><font size="-1" color="#ffccff" face="SimSun"># -l 是『加入某个函式库(library)』的意思,而</font><br><font size="-1" color="#ffccff" face="SimSun"># m 则是 libm.so这个函式库,其中, lib 与附档名(.a 或 .so)不需要写</font><br><font size="-1" color="#ffccff" face="SimSun"># 所以 -lm表示使用 libm.so (或 libm.a) 这个函式库的意思~</font><br><font size="-1" color="#ffccff" face="SimSun"># 至于那个-L 后面接的路径呢?这表示:</font><br><font size="-1" color="#ffccff" face="SimSun">#『<b>我要的函式库libm.so 请到 /lib 或 /usr/lib 里面搜寻!</b>』</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">./a.out</font></b></font><br><font size="-1" color="#ffffff" face="SimSun">1.000000</font></td></tr></tbody></table><font color="#000000">  </font><br><font color="#000000">上面的说明很清楚了吧!!不过,要注意的是,由于Linux 预设是将函式库放置在 /lib 与 /usr/lib 当中,所以您没有写 -L/lib 与 -L/usr/lib 也没有关系的!不过,万一哪天您使用的函式库并非放置在这两个目录下,那么-L/path 就很重要了!否则会找不到函式库喔!</font><br><font color="#000000"> </font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -