想将APUE里所有源文件编译成一个库,然后直接可以用,就直接Cygwin里操作:
1:vim Make.defines.linux 自定义修改绝对路径
WKDIR=/home/hui/apue.2e
2:vim std/linux.mk
将nawk修改成awk
看了下Makefile,需要遍历好多文件夹,想都没想,直接Make,然后最小化,让它慢慢搞就是了,可是突然搞着搞着,死机了!!!这是神马情况,重启的时候我在想,我修改的配置好像是带linux的,可我这是冒牌linux的cygwin呀,哎,肯定是这问题
进Makefile一看,make会执行$(MAKE) `./systype.sh`,后面多了一个脚本,居然是一个case语句:
#!/bin/sh
case `uname -s` in
“FreeBSD”)
PLATFORM=”freebsd”
;;
“Linux”)
PLATFORM=”linux”
;;
“Darwin”)
PLATFORM=”macos”
;;
“SunOS”)
PLATFORM=”solaris”
;;
*)
echo “Unknown platform” >&2
exit 1
esac
echo $PLATFORM
exit 0
也就是到底执行啥,看uname –s的结果
lihui@LastWish /home/hui/apue.2e $ uname -s
CYGWIN_NT-6.3
我勒个去,难怪,修改的是linux的defines,所以要让这个case语句执行Linux分支,把条件改一改好了:
“CYGWIN_NT-6.3”)
PLATFORM=”linux”
;;
进而make,还是有几行错误,但是静态库libapue.a已经生成了,就不管了
lihui@LastWish /home/hui $ cp apue.2e/lib/libapue.a /usr/lib
lihui@LastWish /home/hui $ cp apue.2e/include/apue.h /usr/include/
对了,还有一个apueerror.h,网上copy一下源码,copy到/usr/include,编译:
lihui@LastWish /home/hui $ gcc lihui.c -lapue
lihui@LastWish /home/hui $ ./a.exe ./
.
..
a.exe
apue.2e
device.c
libapue.a
lihui.c
最后,apue.2e里有apue.h头文件,但是缺少apueerror.h,下面是源码:
/**************
*
*apueerror.h
*
*************/
#include <apue.h>
#include <stdio.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, “\n”);
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(NULL); /* flushes all stdio output streams */
}