Advanced Programming int the Unix Environtment(3rd)下无法找到apue.h文件的解决方法

环境:

Linux ubuntu 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 16:19:23 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
gcc 4.6.3


针对学习《Advanced Programming int the Unix Environment _ Third Edition》中的实例无法找到apue.h头文件的问题,编译时会出现如下的错误:

fatal error: apue.h: No such file or directory compilation terminated.

针对该问题的解决方法如下:

1. 首先到网站http://www.apuebook.com/code3e.html下载源代码(本文针对的第三版的源代码)

2. 下载后,解压:tar -zxvf src.3e.tar.gz

3. 查看解压的文件下的所有问题:ls,内容如下:


4. 打开README,可知,在Linux下,直接输入make即可

# make

但是在我的系统中,直接编译出现如下的错误:


从上面的错误可知,是缺少相应的库支持bsd,上面说找不到“-lbsd”

即缺少libbsd_dev,在Ubuntu下通过如下命令安装bsd库。

#sudo apt-get install libbsd-dev

然后再运行make命令。


ok,编译成功,


现在回到之前自己写的ls_test.c文件目录,在用gcc进行编译,依然有错误。

这是因为还是没有相应的库支持,若要gcc编译成功,就得把apue.3e里面相应的库拷贝到系统库目录下,或者相应的源码文件夹里面,否则再怎么编译,都无法通过。

其实这里面涉及三样东西:工程文件(myls.c),头文件,库文件。

那这要怎样组织这三种文件?

有两种组织方式,一是系统替你组织,二是自己组织。

系统组织很简单,但屏蔽细节太多,就是把库和头文件归类到系统的头文件和库目录下即可;

自己组织,细节明了,但相对复杂,要了解组织原理,但但能够很好地把握整个工程。

毋庸置疑,咱是来学习的,不是来完成任务的,所以选择自己组织。


组织编译的过程,即编写Makefile文件。(咱这里所说的分析程序框架,指的是分析Makefile)

既然apue源码的编译是成功的,那它里面的Makefile文件书写就是没问题的。

咱由问题源头开始,一步一步地往上推。

其实之前敲击的ls_test.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 文件拷贝到 /home/fatasy/apue/src_test/ 工程目录里边,稍作修改就可以为我们所用,修改为如下所示:



现在运行命令:

# make

将会生成ls_test目标文件:


运行命令检测程序的正确性:显示当前目录的所以文件

# ./ls_test /usr/

运行结果如下:


程序正常运行!


上面所诉说的是单个程序相对于整个程序框架所涉及的文件网络关系,以及编译运行它的方式方法。

其他程序亦可用这个方法来去运行。

并且其他类别(其他文件夹)的程序也是可以这样去运行的。它们里面的Makefile相对于上面的分析,也大同小异。

现在就剩源码文件夹根目录里的Makefile没有分析了,来看看它里面的代码:



这个看起来非常简单,用两个循环,分别进入各个子文件夹执行make命令或者执行make clean命令,然后所涉及到的文件关系,由各个文件夹里的Makefile文件来处理(就是重走上面的流程)。就是如此简单!


转载自:http://blog.csdn.net/jasonque/article/details/8933194

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值