最近在读 Richard Stevens的大作《UNIX环境高级编程》,相信很多初读此书的人都会与我一样遇到这个问题,编译书中的程序实例时会出现问题,提示 “错误:apue.h:没有那个文件或目录”。

apue.h是作者自定义的一个头文件,并不是Unix/Linux系统自带的,此头文件包括了Unix程序所需的常用头文件及作者Richard自己写的出错处理函数。所以在默认情况下,gcc在编译时是读不到这个头文件的。

  1. 先在这个网站APUE下载tar.gz格式的源码包,然后解压至某个目录,比如说/home/xxx/下.
  2. 进入目录apue.2e,把文件 Make.defines.linux 中的 WKDIR=/home/xxx/apue.2e 修改为 WKDIR=/home/xxx/apue.2e.
  3. 进入apue.2e目录下的std目录,打开linux.mk,将里面的nawk全部替换为awk.
  4. 回到 /home/xxx/apue.2e 目录在终端中输入 “make” .
  5. /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下。
  6. 编辑/usr/include/apue.h 文件, 在最后一行 #endif 前面添加一行
    #include “error.c”
    

通常会遇到下面几个问题。

  1. 找不到”nawk“, 进入apue.2e/std 目录,编辑linux.mk。修改里面所有的nawk为awk。
  2. 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 
    
  3. ARG_MAX未定义, 在apue.2e/include/apue.h中添加一行
    #define ARG_MAX 4096
    
    打开apue.2e/threadctl/getenv1.capue.2e/threadctl/getenv3.c,添加一行:
    #include “apue.h”        
    
  4. /usr/include/bits/timex.h:31:7: 错误, 把ipp.h文件里的status改成其他名称,比如Status。
    #define status u.st
    
    printd.c的第977行中更改成Status。
    i = ntohs(hp->status);