转自:http://blog.csdn.net/jasonque/article/details/8933194
转载没有别的目的,就是想在对apue.3e Makefile不理解是看看。
环境:
Ubuntu10.04
gcc 4.4.3
特别标注:
有些网站转载我的文章不标明出处,并且转载不到位,没有把相应的链接一块转过去,比如说下载链接或相关参考文献的链接等,导致一些网友阅读和使用出现障碍和知识的不连续,所以在此特别标注:我的这篇文章发表在CSDN—— jasonque的博客上,可以到CSDN博客来阅读。
正文:
《UNIX网络编程:卷1》.还没啃完,现在又开始啃APUE.
写这篇文章是由于第一章的ls程序引起的。之前在《UNIX网络编程:卷1》也遇见过(这里),但当时说等我一个一个程序啃完之后再来分析这整个架构。但,现在又遇上了,感觉还是稀里糊涂的,现在决定还是花点时间好好分析分析。
我的问题是这样出现的:
我照着书把第一章1.4节的ls程序敲玩,cc了一下,出现错误(没错误才怪呢!),找不着头文件,还敲少了一个挂单的挂号等等等等等。
头大,把里面自定义的“apue.h”头文件的具体路径填上,妹一下,崩溃,真想叫你妹,同样错误一大堆。
也是,没有库支持,光有头文件有个屁用?
但具体需要什么库支持?这些裤在何方,该怎么穿?
再这样下去,肯定把不了妹。
痛定思痛,好好研究一下APUE的程序框架。
(屌丝都是这样开始裸奔的,然后穿上裤子,再去把妹!)
解压下载过来的源码包(在此下载第三版),打开,看看里面的东东:
打开“README”,里面讲得很简单,就是直接叫你在这个文件夹里面把妹:
# make
一般情况都会编译通过,否则的话就是缺少相应的库支持,比如下面这个错误:
上面说找不到“-lbsd”
那就是缺少libbsd_dev呗,如上所示用
#apt-get install dev-libbsd
安装即可。
然后再运行make命令。
ok,编译成功,再回到之前自己写的myls.c文件目录,再cc一下,错误依然。
那是肯定的,还是没有相应的库支持,如果你要cc成功,就得把apue.3e里面相应的库拷贝到系统库目录下,或者相应的源码文件夹里面,否则你再怎样CC,都没法通过。
其实这里面涉及三样东西:工程文件(myls.c),头文件,库文件。
那这要怎样组织这三种文件?
有两种组织方式,一是系统替你组织,二是自己组织。
系统组织很简单,但屏蔽细节太多,就是把库和头文件归类到系统的头文件和库目录下即可;
自己组织,细节明了,但相对复杂,要了解组织原理,但但能够很好地把握整个工程。
毋庸置疑,咱是来学习的,不是来完成任务的,所以选择自己组织。
组织编译的过程,就是把妹的过程,即编写Makefile文件。(咱这里所说的分析程序框架,指的是分析Makefile)
既然apue源码的编译是成功的,那它里面的Makefile文件书写就是没问题的。
咱由问题源头开始,一步一步地网上推。
其实之前敲击的myls.c程序,就在apue的源码里边(./intro/ls1.c)。
它所在的文件夹有一个Makefile文件,注释分析如下:
上面提到了三个文件:systype.sh,Make.defines.linux,Make.libapue.inc。下面就来看看这三个文件
先来看看systype.sh这个文件,这是一个shell脚本文件,可以直接在终端直接执行这个文件:
也就是说它是一个shell命令集,看看里面的代码(这里就不表了),其实它的作用就是运行了一条shell命令:
# uname -s
这条命令会返回一个“Linux”的字符串,这就是咱现在运行的平台。
再来看看Make.defines.linux文件。根据不同的平台,对make的内置规则进行修改,这里是根据linux平台进行的修改
再来看看Make.libapue.inc文件,里面的内容很简单,就是进入源码目录的lib文件夹里面执行make命令。
好,现在这三个文件都分析完了,就这些就足以让ls1.c跑起来了。其实说白了,只要intro/Makefile文件的东西理解了就好办了。
PS:(其实书里的所有代码,都在这个源码文件夹里面了,不必自己敲,但为了练习手感、灵感,加深认识的深度和映像,最好自己敲一遍。
其实编译和运行目标文件都可以在源码文件夹里进行,
但这里我只想在自己定义的工程文件夹里敲代码,编译代码,运行目标程序,如果是这样的话,就要在理解上面所说内容的基础上,做些修改了,下来就讲讲这方面的东东)
现在回到自己的 /root/test/ 工程目录里边
把apue源码文件夹里面的 ./intro/Makefile 文件拷贝到 /root/test/ 工程目录里边,稍作修改就可以为我们所用,修改为如下所示:
现在运行命令:
# make
将会生成myls目标文件:
运行命令检测程序的正确性:显示当前目录的所以文件
# ./myls ./
运行结果如下:
程序正常运行!
上面所诉说的是单个程序相对于整个程序框架所涉及的文件网络关系,以及编译运行它的方式方法。
其他程序亦可用这个方法来去运行。
并且其他类别(其他文件夹)的程序也是可以这样去运行的。它们里面的Makefile相对于上面的分析,也大同小异。
现在就剩源码文件夹根目录里的Makefile没有分析了,来看看它里面的代码:
这个看起来非常简单,用两个循环,分别进入各个子文件夹执行make命令或者执行make clean命令,然后所涉及到的文件关系,由各个文件夹里的Makefile文件来处理(就是重走上面的流程)。就是如此简单!