UNIX环境高级编程------apue.h找不到

时间:2022-09-04 16:44:03

运行1-3代码时,出现问题:apue.h 没有找到问题

1.去此网址下载源码: http://www.apuebook.com/code3e.html

压缩包名为:src.3e.tar.gz

2.解压文件:

输入命令:tar -zvx -f src.3e.tar.gz

3.安装:

命令:make

4.需要的文件位置:

/home/mark/Downloads/apu.3e/include /* apue.h */

/home/mark/Downloads/apu.3e/lib /* error.c */

执行命令:cp ./include/apue.h ./lib/error.c /usr/include

把他们拷贝到C语言默认的工作目录(以我的电脑为例)

在解决完头文件的问题之后,还会出现一下错误

: undefined reference to `err_quit'
: undefined reference to`err_sys'

这是因为

err_quit跟err_sys是作者自己定义的错误处理函数,需要单独定义头文件

解决方法:

在/usr/include 下新建一个名为myerr.h的文件

里面的内容为

#include "apue.h"
#include <errno.h> /* for definition of errno */
#include <stdarg.h> /* ISO C variable aruments */

static void err_doit(int, int, const char *, va_list);

/*
* Nonfatal error related to a system call.
* Print a message and return.
*/
void
err_ret(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
}

/*
* Fatal error related to a system call.
* Print a message and terminate.
*/
void
err_sys(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
exit(1);
}

/*
* Fatal error unrelated to a system call.
* Error code passed as explict parameter.
* Print a message and terminate.
*/
void
err_exit(int error, const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(1, error, fmt, ap);
va_end(ap);
exit(1);
}

/*
* Fatal error related to a system call.
* Print a message, dump core, and terminate.
*/
void
err_dump(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
abort(); /* dump core and terminate */
exit(1); /* shouldn't get here */
}

/*
* Nonfatal error unrelated to a system call.
* Print a message and return.
*/
void
err_msg(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(0, 0, fmt, ap);
va_end(ap);
}

/*
* Fatal error unrelated to a system call.
* Print a message and terminate.
*/
void
err_quit(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(0, 0, fmt, ap);
va_end(ap);
exit(1);
}

/*
* Print a message and return to caller.
* Caller specifies "errnoflag".
*/
static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf, MAXLINE, fmt, ap);
if (errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
strerror(error));
strcat(buf, " ");
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(NULL); /* flushes all stdio output streams */
}

在源文件中添加#include <myerr.h>就大功告成了