一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

linux Makefile编写总结及常用的Makefile编写格式

时间:2015-11-06 编辑:简简单单 来源:一聚教程网

以下是对 Linux Makefile的编写整理的五个步骤:

编译总共为五个部分
 1.设置编译环境 set compile environment
 2.获取要编译的源文件,以及把源文件转换为目标文件 ( 源文件和目标文件) source to obj
 3.将文件编译为目标文件 OBJing
 4.将目标文件链接成可执行文件或(打包为)动态库,或静态库  linking
 5.其他方面 clean等

下面给出一个简单的makefile模板(实际项目中可依照此模板进行扩展):

来看看这个模板:

## 设置编译环境
CC:=gcc
CXX:=g++
BIN:= libdemo.so
FLAGS             := -Wall -g -fPIC
CXX_FLAGS     := -Wall -g -pipe -fPIC -shared -export-dynamic
LIB                   := -L../common/test/ -ltest
INCLUDE_PATH    := -I/common/ -I../common/test/

## 获取要编译的源文件,以及把源文件转换为目标文件
SOURCES            := $(wildcard *.c *.cpp)
OBJS             := $(patsubst %.c, %.o, $(patsubst %.cpp,%.o,$(SOURCES)) )

## 将源文件编译为目标文件
%.o: %.c
    $(CC) $(FLAGS) -c $< -o $@ $(INCLUDE_PATH)

%.o:%.cpp
    $(CXX) $(FLAGS) -c $< -o $@ $(INCLUDE_PATH)

## 将目标文件链接成可执行文件或动态库,或静态库
$(BIN) : $(OBJS)
    $(CXX) $(CXX_FLAGS) $(OBJS) $(INCLUDE_PATH) $(LIB) -o $(BIN)
    chmod a+x $(BIN)

## 其他
clean:
    rm -rf *.o $(BIN)
      
install:
    cp $(BIN) ../common/bin
    

    
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也就这三种格式,希望对大家有用。

热门栏目