在linux下面,我们不得不自己写makefile,makefile的确博大精深,但是实际上对于日常的使用来说,无非就是

1:编译可执行程序。2:编译lib库 3:编译so库

本博针对上面三种目的各自写出了makefile模版,希望对大家有所帮助。

一.编译可执行程序

当前目录下制定文件编译成可执行文件(连接外部库的话只需要更改INC和LIB即可)

CXX = g++

TARGET = bitmaploctest

C_FLAGS += -g -Wall

LIB_FLAGS = -pthread

all: $(TARGET)

bitmaploctest: bitmaploctest.o bitmaploc.o file_lock.o

$(CXX) -o $@ $^ $(LIB_FLAGS) $(LIB) $(C_FLAGS)

.cpp.o:

$(CXX) -c -o $*.o $(INC) $(C_FLAGS) $*.cpp

.cc.o:

$(CXX) -c -o $*.o $(INC) $(C_FLAGS) $*.cc

clean:

-rm -f *.o $(TARGET)

二.编译成lib库

当前目录下指定文件编译成lib库(一般lib库在编译的时候不会将使用的外部库编译进来,而是等编译成可执行程序时或者.so时)

INC_DIR= ./

SRC_DIR= ./

OBJ_DIR= ./

LIB_DIR= ./

H_DIR= ./

OBJ_EXT= .o

CXXSRC_EXT= .cpp

CSRC_EXT= .c

LIB_EXT= .a

H_EXT= .h

OBJECTS = $(OBJ_DIR)bitmaploc$(OBJ_EXT)

$(OBJ_DIR)file_lock$(OBJ_EXT)

LIB_TARGET = $(LIB_DIR)libbitmaploc$(LIB_EXT)

$(OBJ_DIR)%$(OBJ_EXT): $(SRC_DIR)%$(CXXSRC_EXT)

@echo

@echo “Compiling $< ==> $@…”

$(CXX) $(INC) $(C_FLAGS) -c $< -o $@

$(OBJ_DIR)%$(OBJ_EXT): $(SRC_DIR)%$(CSRC_EXT)

@echo

@echo “Compiling $< ==> $@…”

$(CC) -I./ $(INC) $(C_FLAGS) -c $< -o $@

all:$(LIB_TARGET)

$(LIB_TARGET): $(OBJECTS)

all: $(OBJECTS)

@echo

$(AR) rc $(LIB_TARGET) $(OBJECTS)

@echo “ok”

clean:

rm -f $(LIB_TARGET) $(OBJECTS)

三.编译成so库

当前目录下指定文件编译成so库(必须将所有引用的外部库都编译进来)

CC = gcc

CXX = g++

CFLAGS  = -Wall -pipe -DDEBUG -D_NEW_LIC -g -D_GNU_SOURCE -shared -D_REENTRANT

LIB     = -lconfig -ldl -lrt -L../../lib -lttc -g

INCLUDE = -I../spp_inc

OO    = service.o tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o uin_conf.o stat.o

TARGETS = ../../lib/libRanch.so

all: $(TARGETS)

stat:tool_stat.cpp

$(CXX) $(INCLUDE) tool_stat.cpp -o tool_stat stat.o tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o -g

cp tool_stat ../../bin

$(TARGETS): $(OO)

$(CXX) $(CFLAGS) $(INCLUDE) $(OO) -o $@ $(LIBDIR) $(LIB)

.c.o:

$(CC)  $(CFLAGS) -c $(INCLUDE) $<

echo $@

.cpp.o:

$(CXX) $(CFLAGS) -c $(INCLUDE) $<

echo $@

%:%.c

$(CC) $(CFLAGS) -o $@ $< $(OO) $(LDFLAGS)

echo $@

clean:

rm -f *.o

rm -f $(TARGETS)

rm -f tool_stat

OK,我常用的makefile也就这三种格式,希望对大家有用