您的位置:首页 > 运维架构 > Linux

linux常用的makefile模版编写

2014-03-03 22:57 302 查看
linux常用的makefile模版编写

在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

 

TARGET:=attention

INCDIR:=inc

SRCDIR:=src

OBJDIR:=obj

$(shell if !([ -d $(OBJDIR) ]);then mkdir $(OBJDIR);fi)

LIBDIR:=lib

$(shell if !([ -d $(LIBDIR) ]);then mkdir $(LIBDIR);fi)

CC  :=g++

FLAGS:=-Wall -W -I$(INCDIR) -D_DEBUG

LIBS :=-lm

OPENCV=1 #switch of opencv

ifdef OPENCV

FLAGS+=`pkg-config --cflags opencv`

LIBS +=`pkg-config --libs opencv`

endif

#DBG=0

ifdef DBG

FLAGS+=-g

else

FLAGS+=-O2

endif

SRC:=$(wildcard $(SRCDIR)/*.cpp)

OBJ:=$(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(SRC)))

#all:

#    @echo $(OBJ)

#

$(TARGET):$(OBJ)

    $(CC) -o $@ $^ $(FLAGS) $(LIBS)

$(OBJDIR)/%.o:$(SRCDIR)/%.cpp 

    $(CC) -c $< -o $@ $(FLAGS)

.PHONY: clean

clean:

    rm -f $(OBJDIR)/*.o *~ core

OK,我常用的makefile也就这三种格式,希望对大家有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: