实验环境:centos7 gnome桌面版
1.安装编译器gcc,同时会自动安装依赖库。如未自动安装,需要手动安装。
2.下载apue.2e源码,并解压主目录~/
3.修改apue.2e源码下的环境变量设置文件Make.defines.linux
-
$cd ~/apue.2e
-
$pwd
-
yourdir
-
$vim Make.defines.linux
-
WKDIR=yourdir
4.修改apue.2e/std下文件linux.mk
-
$cd ~/apue.2e/std
-
$vim linux.mk
-
:%s/nawk/awk/g //将所有nawk替换为awk
5
.把apue.2e/include下作者自己定义的头文件apue.h放入系统头文库 /usr/include
-
$cd ~/apue.2e/include
-
$sudo cp apue.h /usr/include
6.在
系统头文库 /usr/include中新建作者定义的出错处理函数,参考apue(2e)附录B
-
$cd /usr/include
-
$vim 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 */
-
}
7.在源码文件中编译所有文件
8.编译报错
(1)如果出现stropts.h缺失的情况,则下载,解压
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
(2)如果在编译时提示ARG_MAX未定义,可以修改如下:
在apue.2e/include/apue.h中添加一行:
#define ARG_MAX 4096
打开apue.2e/threadctl/getenv1.c 和apue.2e/threadctl/getenv3.c,添加一行:
#include "apue.h"
(3)如果在编译时提示ipp.h error expected 各种符号,因为ipp.h中的status与/usr/include/sysdeps/x86_64/timex.h中的status冲突了
把ipp.h中的宏定义#define status ... 改为#define Status,并在使用该定义的文件printd.c中将hp->status改为hp->Status
阅读(3479) | 评论(0) | 转发(4) |