JunoteUNIX环境高级编程中的apue.h错误 2016-03-03
最近在读 Richard Stevens的大作《UNIX环境高级编程》,相信很多初读此书的人都会与我一样遇到这个问题,编译书中的程序实例时会出现问题,提示 “错误:apue.h:没有那个文件或目录”。
apue.h是作者自定义的一个头文件,并不是Unix/Linux系统自带的,此头文件包括了Unix程序所需的常用头文件及作者Richard自己写的出错处理函数。所以在默认情况下,gcc在编译时是读不到这个头文件的。
- 先在这个网站APUE下载tar.gz格式的源码包,然后解压至某个目录,比如说/home/xxx/下.
- 进入目录
apue.2e,把文件Make.defines.linux中的WKDIR=/home/xxx/apue.2e修改为WKDIR=/home/xxx/apue.2e. - 进入
apue.2e目录下的std目录,打开linux.mk,将里面的nawk全部替换为awk. - 回到
/home/xxx/apue.2e目录在终端中输入 “make” . - 把
/home/xxx/apue.2e/inlcude目录下的apue.h文件和位于/home/xxx/apue.2e/lib目录下的error.c文件都复制到/usr/include目录下,apue.2e/lib/libapue.a到/usr/lib/和/usr/lib64下。 - 编辑
/usr/include/apue.h文件, 在最后一行 #endif 前面添加一行#include “error.c”
通常会遇到下面几个问题。
- 找不到”nawk“, 进入
apue.2e/std目录,编辑linux.mk。修改里面所有的nawk为awk。 stropts.h找不到的情况,则下载glibc-2.11,解压缩在apue.2e里.cp ./glibc-2.11/streams/stropts.h /usr/include cp ./glibc-2.11/bits/stropts.h /usr/include/bits cp ./glibc-2.11/sysdeps/x86_64/bits/xtitypes.h /usr/include/bitsARG_MAX未定义, 在apue.2e/include/apue.h中添加一行
打开#define ARG_MAX 4096apue.2e/threadctl/getenv1.c和apue.2e/threadctl/getenv3.c,添加一行:#include “apue.h”/usr/include/bits/timex.h:31:7: 错误, 把ipp.h文件里的status改成其他名称,比如Status。
在#define status u.stprintd.c的第977行中更改成Status。i = ntohs(hp->status);