<Unix环境高级编程>apue.h在Fedora14下开发环境搭建
学习linux有一段时间了,刚开始学Linux C 系统编程时用的书是<Linux C编程实战>,这本书感觉入门学习还不错,里面的程序易理解,但看了K&R的巨著<C程序设计语言>,<Linux C编程实战>还是不太深厚(国人编书的经常犯的毛病)好像讲了什么、其实什么都没讲。
这些天从网上买了一本《UNIX环境高级编程》。里面出现作者Rago自编的apue.h头文件,于是想从网上下载源码。网上搜了几篇,感觉按照参考文章一提供的方案后,还是不行。后来就搜到了参考文章二。现总结如下:
1、到www.apuebook.com下载src.tar.gz文件。
2、解压缩:tar -xvf src.tar.gz /home/yuesichiu
3、先仔细阅读里面的READEME文件(自学的人都喜欢这样看源代码),进入目录/home/yuesichiu/Unix/apue.2e,把文件Make.defines.linux 中的WKDIR=/home/sar/apue.2e 修改为 WKDIR=/home/yuesichiu/Unix/apue.2e。按照文件里面修改路径然后make(出现错误,不去理会)
4、然后再进入apue.2e目录下的std目录,打开linux.mk,将里面的nawk全部替换为awk
5、把 /home/limeng/apue.2e/inlcude目录下的 apue.h 文件最后添加一行 #include "error.c",将该文件拷贝到/usr/include 目录中。
6、把 /home/limeng/apue.2e/lib目录下的 error.c拷贝到/usr/include 目录中。
7、编译成功,OK!
其实当你直接运行apue.2e目录下的文件会告知,没这个文件。
可以这样处理:
由于fig10.2等文件都是软连接,先查看源文件在哪。fig10.2在目录signals/sigusr,c就是fig10.2的真正文件,到里面去编译。
gcc -o sigusr sigusr.c
[1]、http://go.rritw.com/www.cnblogs.com/feiling/archive/2012/02/15/2353286.html
[2]、http://go.rritw.com/ouyangwulin.blog.163.com/blog/static/422233212011108145144/
apue源码make:/usr/include/bits/timex.h:31:7: 错误:expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ be的解决方法http://blog.youkuaiyun.com/willierjyt/article/details/6079461
如题,出现这个问题的原因是在timex.h的第31行出现了status的定义:- int status; /* clock command/status */
而文件apue.2e/ipp/ipp.h中有宏定义:
- #define status u.st
这样编译的时候就出问题了,如编译提示:
- expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘.’ token
解决方法是把ipp.h文件里的status改成其他名称,比如Status,再次编译,错误提示status神马的信息,找到status出错的位置,把它改为Status就行了。
此处我的status出错位置在printd.c的第977行中:
- i = ntohs(hp->status);
关于apue源码的其他问题请看:
apue源代码的使用与编译
最近在读 Richard Stevens 的大作《UNIX环境高级编程》,相信很多初读此书的人都会与我一样遇到这个问题,编译书中的程序实例时会出现问题,提示 “错误:apue.h:没有那个文件或目录”。
apue.h 是作者自定义的一个头文件,并不是Unix/Linux系统自带的,此头文件包括了Unix程序所需的常用头文件及作者Richard自己写的出错处理函数。所以在默认情况下,gcc在编译时是读不到这个头文件的。
先在这个网站 http://www.apuebook.com/ 下载tar.gz格式的源码包,然后解压至某个目录,比如说/home/yarkee/下,然后进入目录apue.2e,把文件Make.defines.linux 中的 WKDIR=/home/xxx/apue.2e 修改为 WKDIR=/home/yarkee/apue.2e ,然后再进入apue.2e目录下的std目录,打开linux.mk,将里面的nawk全部替换为awk,如果是用的vi/vim编辑器,可以使用这个命令 :1.$s/nawk/awk/g (注意前面有冒号)
然后在此目录下运行make命令,即回到 /home/yarkee/apue.2e 目录在终端中输入 “./make” (不含引号)
然后把 /home/yarkee/apue.2e/inlcude 目录下的 apue.h 文件和位于 /home/yarkee/apue.2e/lib 目录下的 error.c 文件都复制到 /usr/include 目录下,注意复制这两个文件你需要有root权限。之所以要这样做,是因为gcc在链接头文件时会到 /usr/include 这个目录下寻找需要的头文件,若找不到则报错。
最终还要编辑一下复制过来的 apue.h 文件
在最后一行 #endif 前面添加一行 #include “error.c”
错误与解决
gcc -DLINUX -ansi -I/home/sdoning/apue/apue.2e/include -Wall -D_GNU_SOURCE -c -o getenv1.o getenv1.c
getenv1.c:4: error: ‘ARG_MAX’ undeclared here (not in a function)
make[2]: *** [getenv1.o] Error 1
make[2]: Leaving directory `/home/sdoning/apue/apue.2e/threadctl’
make[1]: *** [linux] Error 1
make[1]: Leaving directory `/home/sdoning/apue/apue.2e’
make: *** [all] Error 2
解决方法:
在apue.2e/include/apue.h中添加一行:
#define ARG_MAX 4096
打开apue.2e/threadctl/getenv3.c(包括getenv1.c),添加一行:
#include "apue.h"
再次编译即可。