Cygwin生成APUE静态库

作者: LiHui 分类: Linux 发布时间: 2015-01-02 22:53

想将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 */ 

纯属恶搞

浙ICP备16024533号

浙公网安备 33010802007459号