随着技术的不断积累,发现有很多知识有必要分享一下,在此先分享一下Makefile的使用:
(一)单独模块的makefile
该Makefile是我在使用的过程中逐渐积累下来的,相当于一个小的模块的Makefile,可以直接生成一个.so或.a文件
# $< 第一个依赖文件
# $@ 目标文件
# $^ 所有依赖文件
#定义gcc
CC := gcc
LD := gcc
MKDIR:=mkdir
#定义各个目录
IDIR=include
ODIR=obj
LDIR=lib
SRCDIR=src
#定义各个flags
CCFLAGS = -g
CCFLAGS += -I$(IDIR)
#CCFLAGS += -I ../include
#CCFLAGS += -I ../../include
CCFLAGS += -std=c99
CCFLAGS += -Wall
CCFLAGS += -fPIC
CCFLAGS += -D _OS_LINUX_
LDFLAGS := -lpthread -lm
#定义目标文件
_OBJ+=hsc.o
_OBJ+=skt.o
OBJ=$(patsubst %, $(ODIR)/%, $(_OBJ))
#定义lib文件
#_LIB=libskt.a
#LIB=$(patsubst %, $(LDIR)/%, $(_LIB))
#_SO_LIB=libskt.so
#SO_LIB=$(patsubst %, $(LDIR)/%, $(_SO_LIB))
.PHONY: all
all: create_dir $(LIB) $(SO_LIB)
#生成lib文件
$(LIB): $(OBJ)
ar -rc $@ $^
$(SO_LIB):$(OBJ)
ld -shared -o $@ $^
create_dir:
@if test ! -d $(ODIR);\
then\
mkdir $(ODIR);\
fi
@if test ! -d $(LDIR);\
then\
mkdir $(LDIR);\
fi
#生成目标文件
$(ODIR)/%.o: $(SRCDIR)/%.c $(DEPS)
$(CC) -c -o $@ $< $(CCFLAGS)
.PHONY: clean
clean:
rm -rf $(ODIR) $(LDIR)
(二)一个可执行程序的makefile:
该makefile相当简单,结果会生成两个可执行文件:server,client
CC=gcc
RM=rm
CFLAGS+=-D _OS_LINUX_
CFLAGS+= -I ../include
CFLAGS+= -Wall
CFLAGS+= -g
LDFLAGS+= -lpthread ../lib/libskt.so
BINARIES=
BINARIES+=server
BINARIES+=client
default: all
server: server.c
$(CC) server.c -o server $(CFLAGS) $(LDFLAGS)
client: client.c
$(CC) client.c -o client $(CFLAGS) $(LDFLAGS)
all: $(BINARIES)
clean:
$(RM) -f *.o
$(RM) -f $(BINARIES)