Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1745195
  • 博文数量: 263
  • 博客积分: 1218
  • 博客等级: 少尉
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-19 02:33
文章分类

全部博文(263)

文章存档

2020年(12)

2019年(2)

2018年(10)

2016年(1)

2015年(20)

2014年(115)

2013年(46)

2012年(37)

2011年(20)

分类: LINUX

2014-07-15 16:44:31

初学《UNIX环境高级编程》的朋友都会遇到一个问题,运行里面的实例(download: )时就出现问题,提示 "错误:apue.h:没有那个文件或目录". 
apue.h是作者自定义的一个头文件,包括程序所需的常用头文件及出错处理函数。所以因该将它放入系统头文件中(Linux下是 /usr/include),这样gcc编译器就可以找到它了。 
在去下载apue.h之前,为了后面的编译,首先装g++吧,亲~否则就等着gcc编译.cpp文件报错了。

接下来,按正常步骤来吧:
1、先在这个网站 下载tar.gz格式的源码包,然后解压至某个目录,比如说/home/xhm/下,然后进入目录apue.2e,把文件 Make.defines.linux 中的 WKDIR=/home/sar/apue.2e 修改为 WKDIR=/home/xhm/apue.2e ,然后再进入apue.2e目录下的std目录,打开linux.mk,将里面的nawk全部替换为awk。

2、然后在此目录下运行make命令,即回到 /home/xhm/apue.2e 目录在终端中输入 “make” (不含引号)
出现错误1:没找到apue.h。
解决:把当前源码中的apue.h(在include/apue.h)拷贝到/usr/include
再编译,出现错误2:ARG_MAX 没找到
在apue.h中加入#define ARG_MAX 4096
再编译:出现没找到
 。在那个文件加入 #include 就可以
(apue.2e/threadctl/getenv1.c 和apue.2e/threadctl/getenv3.c 一般这两个文件出现这点错误)
再编译,出现错误:
In file included from /usr/include/i386-linux-gnu/bits/time.h:86:0,
                 from /usr/include/time.h:42,
                 from /usr/include/pthread.h:26,
                 from printd.c:11:
/usr/include/i386-linux-gnu/bits/timex.h:31:7: 错误: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘.’ token


这是linux的time.h中定义林全局变量status,在apue.h/ipp的ipp.h中也定义了,改成Status,
编译出错的时候将相应位置的status改成Status即可,再把apue.h/ipp/printd.c中的hp->status 改成hp->Status即可。

最后编译通过。


3、最后把apue.h/lib下的error.c放到/usr/include/中,用vi在apue.h的最后一行 #endif前 加一句#include"error.c "这就是书本中第一个实例定义的err_quit和err_sys输出方法。如果用gedit添加,可能还是会出现
“致命错误: error.c :没有那个文件或目录
编译中断。


接下来,书中的代码就可以使用了~~

PS:其实还可以更加简单,下载了apue.h以后,将apue.h放到
/usr/include/下,在/apue.2e/lib/error.c,将error.c复制到/usr/include/下,在apue.h的最后一行 #endif前 加一句#include"error.c ",即可。但是不保证能全部执行书上代码。
不过如一楼网友所言,这样简单做APUE的例子代码16_4的时候就出现了函数重定义的错误。本人没验证过,受教。
转:http://jimslinbing.blog.163.com/blog/static/85054319201292712414518/
阅读(8595) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~