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/bits
ARG_MAX
未定义, 在apue.2e/include/apue.h
中添加一行
打开#define ARG_MAX 4096
apue.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.st
printd.c
的第977行中更改成Status。i = ntohs(hp->status);