UNIX环境高级编程(第二版) apue.h头文件的配置

初学《UNIX环境高级编程》的朋友都会遇到一个问题,运行里面的实例(download: http://www.apuebook.com/)时就出现问题,提示 "错误:apue.h:没有那个文件或目录". 
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文件

 解决:通过终端命令符完成

1.UBUNTU中如何获得root权限

在终端中输入:
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的时候就出现了函数重定义的错误。本人没验证过,受教。

你可能感兴趣的:(编程,unix)