apue.h是作者自定义的一个头文件,包括程序所需的常用头文件及出错处理函数。所以应该将它放入系统头文件中(Linux下是 /usr/include),这样gcc编译器就可以找到它了。
解决方法:
一:新建文件夹中运行(Ubuntu12):
(1)将error.c和apue.h复制到新建文件夹中
(2)在apue.h中添加 #include "error.c"
二:在Ubuntu 12.04系统下配置apue2环境。
0、为了操作方便,建议使用root权限。
1、下载源码包,解压至某个目录,比如:/root/apue.2e。
-------------------------------------------------------------
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2013年资料/1月/8日/Ubuntu 12.04 配置apue2环境
-------------------------------------------------------------
2、将/root/apue.2e/Make.defines.linux中第6行WKDIR=/home/sar/apue.2e更改为/root/apue.2e。
3、将/root/apue.2e/ipp/ipp.h中第122行中的status换为Status。(也可换为其他,但要与下面对应)
4、将/root/apue.2e/ipp/printd.h中第977行中的status替换为Status。(与上面对应)
5、将/root/apue.2e/threadctl/getenv1.c和/root/apue.2e/threadctl/getenv3.c中第1行#include<limits.h>更换为#include <linux/limits.h>。
6、此时,如果编译通过,会在/root/apue.2e/lib/目录下生成libapue.a静态链接库文件。
7、将/root/apue.2e/lib/libapue.a拷贝至/usr/local/lib/目录下。
8、将/root/apue.2e/include/apue.h拷贝至/usr/local/include/目录下。
9、编译示例:gcc main.c -lapue 。
OVER!
以下方法本人验证未成功,望牛人指出错误所在:
接下来,按正常步骤来吧:
1、先在这个网站 http://www.apuebook.com/ 下载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
{注:此处可能提示出错:权限不够,无法在/usr/include目录下创建apue.h文件
解决:通过终端命令符完成
在终端中输入:
sudo passwd root
Enter new UNIX password: (在这输入你的密码)
Retype new UNIX password: (确定你输入的密码)
passwd: password updated successfully
以后,如果在想获得root权限,只需进行如下的操作:
su root
Password: (在此输入你上面设置的密码)
如果要再次禁用 root 帐号,
那么可以执行 sudo passwd -l root
2.文件拷贝:linux 怎么样复制文件夹内所有文件到另一个文件夹?
cp -Rf /home/user1/* /root/temp/
将 /home/user1目录下的所有东西拷到/root/temp/下而不拷贝user1目录本身。
即格式为:cp -Rf 原路径/ 目的路径/
}
再编译,出现错误2:ARG_MAX 没找到在apue.h中加入#define ARG_MAX 4096
再编译:出现没找到 <apue.h>。在那个文件加入 #include <apue.h>就可以
(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的时候就出现了函数重定义的错误。本人没验证过,受教。