📄 0520source_code_and_tarball.htm
字号:
<br><font color="#000000">除了连结的函式库之外,您或许已经发现一个奇怪的地方,那就是在我们的sin.c 当中第一行『</font><font color="#000066" face="SimSun"> #include<stdio.h></font><font color="#000000">』,这行说的是要将一些定义数据由stdio.h 这个档案读入,这包括 printf 的相关设定。这个档案其实是放置在 /usr/include/stdio.h的!那么万一这个档案并非放置在这里呢?那么我们就可以使用底下的方式来定义出要读取的include 档案放置的目录:</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 -I/usr/include</font></b></font></td></tr></tbody></table><font color="#000000">  </font><br><font color="#000000">-I/path 后面接的路径( Path )就是设定要去搜寻相关的include 档案的目录啦!不过,同样的,默认值是放置在 /usr/include 底下,除非您的include 档案放置在其它路径,否则也可以略过这个项目!</font><br><font color="#000000"> </font><br><font color="#000000">透过上面的几个小范例,您应该对于 gcc 以及原始码有一定程度的认识了,再接下来,我们来稍微整理一下gcc 的简易使用方法吧!</font></blockquote></blockquote><ul><hr width="100%"><a name="simple_ex_gcc"></a><img src="0520source_code_and_tarball_files/penguin-s.gif" nosave="" align="middle" height="23" width="17"><font color="#000099">gcc的用法</font></ul><ul><ul>前面说过, gcc 为 Linux 上面最标准的编译器,这个 gcc 是由 <a href="http://www.gnu.org/" target="_blank">GNU</a>所维护的,有兴趣的朋友请自行前往参考。既然 gcc 对于 Linux 上的 Open source是这么样的重要,所以底下我们就列举几个 gcc 常见的参数,如此一来大家应该更容易了解原始码的各项功能吧?!<br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" color="#cccccc" face="SimSun"># 仅将原始码编译成为目标文件,并不制作连结等功能:</font><br><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 这个档案,但是并不会产生 binary 执行档。</font><br><font size="-1" color="#ffffff" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 在编译的时候,依据作业环境给予最佳化执行速度</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -O hello.c -c</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># 会自动的产生hello.o 这个档案,并且进行最佳化喔!</font><br><font size="-1" color="#cccccc" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 在进行 binaryfile 制作时,将连结的函式库与相关的路径填入</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc sin.c -lm -L/usr/lib -I/usr/include</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># 这个指令较常下达在最终连结成binary file 的时候,</font><br><font size="-1" face="SimSun"><font color="#ff6666"># </font><font color="#ffccff">-lm指的是 libm.so 或 libm.a 这个函式库档案;</font></font><br><font size="-1" face="SimSun"><font color="#ff6666"># </font><font color="#ffccff">-L后面接的路径是刚刚上面那个函式库的搜寻目录;</font></font><br><font size="-1" face="SimSun"><font color="#ff6666"># </font><font color="#ffccff">-I后面接的是原始码内的 include 档案之所在目录。</font></font><br><font size="-1" color="#ff6666" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 将编译的结果输出成某个特定档名</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -o hello hello.c</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># -o 后片接的是要输出的binary file 檔名</font><br><font size="-1" color="#ff6666" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 在编译的时候,输出较多的讯息说明</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -o hello hello.c -Wall</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># 加入 -Wall之后,程序的编译会变的较为严谨一点,</font><br><font size="-1" color="#ff6666" face="SimSun"># 所以警告讯息也会显示出来!</font></td></tr></tbody></table><font color="#000000">  </font><br><font color="#000000">比较重要的大概就是这一些。</font><font color="#000066">另外,我们通常称-Wall 或者 -O 这些非必要的参数为旗标( FLAGS ),因为我们使用的是 GCC ,所以有时候也会简称这些旗标为CCFLAGS ,</font><font color="#000000">这些变量偶尔会被使用的喔!尤其是在后头会介绍的make 相关的用法时,更是重要的很吶! ^_^</font></ul></ul><hr width="100%"><a name="make"></a><img src="0520source_code_and_tarball_files/penguin-m.gif" alt="" nosave="" align="middle" height="34" width="25"><font size="+1" color="#000099">make的简易用法</font><blockquote>在前言的部分我们提到过 make 的功能是可以简化编译过程里面所下达的指令,同时还具有很多很方便的功能!那么底下咱们就来试看看使用make 简化下达编译指令的流程吧!<br> <br><hr width="100%"><a name="make_why"></a><img src="0520source_code_and_tarball_files/penguin-s.gif" nosave="" align="middle" height="23" width="17"><font color="#000099">为什么要用make</font><blockquote>先来想象一个案例,假设我的执行档里面包含了四个原始码档案,分别是main.c haha.c sin_value.c cos_value.c 这四个档案,这四个档案您可以到 <a href="http://linux.vbird.org/download/books/basic/source_code/main.tgz">http://linux.vbird.org/download/books/basic/source_code/main.tgz</a>来下载,由于这四个档案里面包含了相关性,并且还用到数学函式在里面,所以如果您想要让这个程序可以跑,那么就需要这样编译:<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 main.c</font></b></font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -c haha.c</font></b></font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -c sin_value.c</font></b></font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">gcc -c cos_value.c</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># 先以上面的动作制作出四个目标文件,然后再进行下面的动作:</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 main main.o haha.o sin_value.o\</font></b></font><br><font size="-1" face="SimSun"><font color="#ffffff">></font><b><font color="#ffff00">cos_value.o -lm -L/usr/lib -L/lib</font></b></font><br><font size="-1" color="#ff6666" face="SimSun"># 这样就可以制作出 main 这个执行档啰!执行看看吧!</font><br><font size="-1" color="#cccccc" face="SimSun"> </font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">./main</font></b></font><br><font size="-1" color="#ffffff" face="SimSun">HaHa! I'm theKing of the world</font><br><font size="-1" color="#ffffff" face="SimSun">0.706825</font><br><font size="-1" color="#ffffff" face="SimSun">0.707388</font></td></tr></tbody></table><font color="#000000"> </font><br><font color="#000000">呵呵!要做好多动作啊!真是麻烦,如果可以的话,能不能一个步骤就给他完成上面所有的动作呢?试看看在这个目录下建立一个makefile 档案,内容如下:</font><br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" color="#cccccc" face="SimSun"># 1. 先建立编译的规则</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">vi makefile</font></b></font><br><font size="-1" color="#ffff00" face="SimSun">main: main.ohaha.o sin_value.o cos_value.o</font><br><font size="-1" color="#ffff00" face="SimSun">       gcc -o main main.o haha.o sin_value.o cos_value.o -lm</font><br><font size="-1" color="#ffccff" face="SimSun"># 注意: gcc之前是 <tab> 按键产生的空格喔!</font><br><font size="-1" color="#ffff00" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 2. 尝试给他建立规则看看</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">rm -f main *.o </font></b><font color="#ffccff"><==先将之前的目标文件去除</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">make</font></b></font><br><font size="-1" color="#ffffff" face="SimSun">cc   -c -o main.o main.c</font><br><font size="-1" color="#ffffff" face="SimSun">cc   -c -o haha.o haha.c</font><br><font size="-1" color="#ffffff" face="SimSun">cc   -c -o sin_value.o sin_value.c</font><br><font size="-1" color="#ffffff" face="SimSun">cc   -c -o cos_value.o cos_value.c</font><br><font size="-1" color="#ffffff" face="SimSun">gcc -o mainmain.o haha.o sin_value.o cos_value.o -lm</font><br><font size="-1" color="#ff6666" face="SimSun"># 这个时候make 会主动去读取 makefile 这个档案的内容,</font><br><font size="-1" color="#ff6666" face="SimSun"># 并根据内容直接去给他编译起相关的执行档啰!</font><br><font size="-1" color="#ffffff" face="SimSun"> </font><br><font size="-1" color="#cccccc" face="SimSun"># 3. 如果再执行一次make 会怎样?!</font><br><font size="-1" face="SimSun"><font color="#ffffff">[guest@testguest]# </font><b><font color="#ffff00">make</font></b></font><br><font size="-1" color="#ffffff" face="SimSun">make: `main'is up to date.</font><br><font size="-1" color="#ff6666" face="SimSun"># 看到了吧?!是否很方便呢?!</font></td></tr></tbody></table><font color="#000000"> </font><br><font color="#000000">或许您会说:『如果我建立一个 shell script 来将上面的所有动作都集结在一起,不是具有同样的效果吗?』呵呵!效果当然不一样,以上面的测试为例,我们仅写出main 需要的目标文件,结果 make 会主动的去判断每个目标文件相关的原始码档案,并直接予以编译,最后再直接进行连结的动作!哈哈!真的是很方便啊!此外,如果我们更动过某些原始码档案,则make 也可以主动的判断哪一个原始码与相关的目标文件档案有更新过,并仅更新该档案,如此一来,将可大大的节省很多编译的时间呢!要知道,某些程序在进行编译的行为时,会消耗很多的CPU 资源呢!所以说, make 有这些好处:</font><ul><li><font color="#000066">简化编译时所需要下达的指令;</font></li><li><font color="#000066">若在编译完成之后,修改了某个原始码档案,则 make 仅会针对被修改了的档案进行编译,其它的object file 不会被更动;</font></li><li><font color="#000066">最后可以依照相依性来更新( update )执行档。</font></li></ul><font color="#000000">既然 make 有这么多的优点,那么我们当然就得好好的了解一下
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -