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

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

版权所有,转载请注明出处。http://www.vimer.cn





原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]

本文链接地址: http://www.vimer.cn/?p=358

2 个评论 在 “linux常用的makefile模版编写”

  1. 最近因为要在练习用各种方式写tcp server。所以想在一个目录里面的多个。cpp文件产生多个可执行文件。但是在产生可执行文件的时候,一直找不到一个比较通用的Makefile写法。不知道你知道不?也google、百度了好多次,也看了文档,但是不知道怎么写。请赐教。
    比如:
    我在文件夹里面有a.cpp b.cpp c.cpp….以后还会添加。
    下面是我写的一个Makefile。在产生执行文件的时候没有想到好的通用的方法。

    CC = gcc
    CXX = g++
    CFLAGS += -g -Wall
    #CFLAGS += -O2 -Wall -pipe -D_GNU_SOURCE
    LIB = -L../lib/
    INCLUDE = -I../lib/

    OO =
    TARGETS = epoll server_fork server_mutil_talk client client_for client_for2 server_select
    SRCS = epoll.cpp server_fork.cpp server_mutil_talk.cpp client.cpp client_for.cpp client_for2.cpp server_select.cpp

    all:$(TARGETS)
    @echo “All”

    $(SRC:%.cpp,%.o): ../lib/comm.o ../lib/net.o
    @echo “link:” $@
    $(CXX) $(CFLAGS) $(INCLUDE) $(LIB) $^ -o $@

    #epoll:epoll.o ../lib/comm.o ../lib/net.o
    # @echo “link:” $@
    # $(CXX) $(CFLAGS) $(INCLUDE) $(LIB) $^ -o $@

    .cpp.o:
    @echo “Compiling:” $@
    $(CXX) $(CFLAGS) -c $(INCLUDE) $<

    .c.o:
    @echo "compiling:" $@
    $(CC) $(CFLAGS) -c $(INCLUDE) $<

    clean:
    rm -f *.o *.so *.d .dep.* $(TARGETS)

    [回复]

    Dante 回复:

    这是我们编译CGI的一个模板,也是一个cpp编译成一个CGI:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    include makefile.inc
     
    trunk_path = $(shell pwd | sed "s/\/application.*//")
     
    #-D_DEBUG_VER_
    C_FLAGS += -MMD -g -Wall -fPIC -shared
     
    TAR_DIR = ./
    SRC_DIR = ./
     
    STRIP_DIR = ../cgi-bin/
    RELEASE_DIR = /data/release/qzone/module/cgi-bin/
     
    TARGETS = \
    		  $(TAR_DIR)targetname.cgi \
     
     
    TAR_SUB_DIRS = $(sort $(dir $(TARGETS)))
     
    DEPENDS = $(patsubst %.cgi, %.d, $(TARGETS))
     
    .PHONY: all clean init CHECK
     
    all: init CHECK $(TARGETS)
    	@echo -e "\033[1;32m\nSuccess!\033[0m"
     
    $(TAR_DIR)%: $(SRC_DIR)%.cpp
    	@echo -e "\033[1;33m\nCompiling&Linking $< ==> $@\033[0m"
    	$(CXX) $(INC) $(C_FLAGS) $< -o $@ $(LIB)
    ifneq ($(TAR_DIR), $(STRIP_DIR))
    	cp $@ $(STRIP_DIR)
    endif
    	strip $(STRIP_DIR)$@
    ifneq ($(STRIP_DIR), $(RELEASE_DIR))
    	cp $(STRIP_DIR)$@ $(RELEASE_DIR)
    endif
     
    clean:
    	rm -f $(TARGETS) $(DEPENDS)
     
    init:
    	mkdir -p $(sort ./ $(TAR_DIR) $(RELEASE_DIR) $(SRC_DIR) $(STRIP_DIR) $(TAR_SUB_DIRS))
     
    CHECK:
    	$(trunk_path)/makeinclude/make_check
     
    -include $(DEPENDS)

    [回复]

我要评论

*

*