2009年3月27日星期五

《UNIX环境高级编程》例子的通用makefile(推荐)

//方法一:普通方法

H_PATH = $(HOME)/unix_c/include #H_PATH是包含头文件apue.h的目录
LIB_PATH = $(HOME)/unix_c/lib
#LIB_PATH是包含书中附带的一些函数库的.c文件的目录
INCLUDE = -I$(H_PATH) -I$(LIB_PATH)

CFLAGS = -g -w -c $(INCLUDE)

FILE = vfork.c error.c

OBJ = $(FILE:.c=.o)
#这里要添加所用到的函数的.o,下面要把他编译出来

all : $(OBJ)
cc -o $@ $(OBJ)
rm -f $(OBJ)
$(FILE).o :
cc $(CFLAGS) $(FILE).c

error.o :
cc $(CFLAGS) $(LIB_PATH)/error.c

clean:
rm -f all $(OBJ)


//方法二:考虑把附带的那些函数编译成.so或.a库包


//先看动态库的例子:多个常用函数编译成一个.so动态库,或者.a静态库

CFLAGS= -fpic -I$(MY_INCL)
OBJS = open_read.o open_write.o sort.o del_repeat.o
FUNC = open_read.c open_write.c sort.c del_repeat.c

#all : libfunc.so
//动态库,如果内容有改动,调用它的程序无须重新编译(如果接口没有被改的话)

#libfunc.so : $(OBJS)
# cc -o $@ -shared $(OBJS) -lc
# cp $@ $(MY_LIB)


all :libfunc.a
//静态库,如果内容有改动,调用它的程序需要重新编译

libfunc.a : $(OBJS)
ar ur $@ $(OBJS)
cp $@ $(MY_LIB)


$(OBJS) : $(F)*.c
cc $(CFLAGS) -c $*.c

clean:
rm -f $(OBJS) libfunc.so libfunc.a


//调用库包里的函数

OBJ=info.o

edit : $(OBJ)
cc -o $@ $(OBJ) -L$(MY_LIB) -lfunc
//如果.so和.a都存在,默认链接.so文件
rm -f $(OBJ)

info.o :
cc -c -I$(MY_INCL) info.c

clean:
rm -f edit $(OBJ)

//方法二:使用动态库

//*************** $(HOME)/unix_c/setenv *********** 记得导入

export LD_LIBRARY_PATH=$APUE_LIB:$LD_LIBRARY_PATH

//**************** ${HOME}/unix_c/public/make.def.public

APUE_LIB = $(HOME)/unix_c/lib #// 准备存放生成的库包
APUE_INCL = $(HOME)/unix_c/include #// apue.h的目录

//**************** 存放函数定义文件(.c文件)目录下的 Makefile

include ${HOME}/unix_c/public/make.def.public

CFLAGS = -c -I$(APUE_INCL)

OBJS = bufargs.o cliconn.o clrfl.o \
daemonize.o error.o lockreg.o locktest.o \
openmax.o pathalloc.o popen.o prexit.o prmask.o \
ptyfork.o linux_ptyopen.o readn.o recvfd.o \
senderr.o sendfd.o servaccept.o servlisten.o \
setfl.o signal.o signalintr.o \
sleep.o sleepus.o spipe.o \
tellwait.o ttymodes.o writen.o # pathconf.o sysconf.o
strerror.o errorlog.o

APUESO = libapue.so

all : $(APUESO)

$(APUESO) : $(OBJS)
cc -o $@ -shared -fpic $(OBJS) -lc
mv -f $(APUESO) $(APUE_LIB)

#all :libapue.a

#libapue.a : $(OBJS)
# ar ur $@ $(OBJS)
# mv -f $@ $(APUE_LIB)


$(OBJS) : $(F)*.c
cc $(CFLAGS) $*.c

clean:
rm -f $(OBJS)

//****************** main主函数文件目录下的 Makefile

include ${HOME}/unix_c/public/make.def.public

CFLAGS = -g -c -I$(APUE_INCL)

FILE = mainfile.c func.c //只要在这里修改添加文件名即可

OBJ = $(FILE:.c=.o)

all : $(OBJ)
cc -o $@ $(OBJ) -L$(APUE_LIB) -lapue

#$(OBJ) : $(F)*.c
# cc $(CFLAGS) $*.c

%.o:%.c
cc $(CFLAGS) $<

clean:
rm -f all $(OBJ)

没有评论: