2009年3月27日星期五

通用makefile文件(适合小型程序)

通常在linux下写c/c++程序时都需要makefile文件,makefile文件的产生通常有三种方式
1. 通过ide帮你生成
2. 使用automake等gnu工具自动生成,这是linux下发布源码的标准方式。
3. 自己手写makefile
三种方式无一例外的都需要随时编辑修改makefile,典型的过程是
编辑源文件.c/.cpp—编辑makefile(通过以上三种方式)—执行make生成可执行程序
本文介绍的这种makefile可以在一定程度上省去第二个过程,因为它利用了makefile的自动扩展和若干默认规则,能较智能的进行编译链接。
makefile全文如下
######################################
#
# Generic makefile
#
# by George Foot
# email: george.foot@merton.ox.ac.uk
#
# Copyright (c) 1997 George Foot
# All rights reserved.
#
# No warranty, no liability;
# you use this at your own risk.#
# You are free to modify and
# distribute this without giving
# credit to the original author.
#
######################################### Customising
#
# Adjust the following if necessary; EXECUTABLE is the target
# executable's filename, and LIBS is a list of libraries to link in
# (e.g. alleg, stdcx, iostr, etc). You can override these on make's
# command line of course, if you prefer to do it that way.
#
#
# 修改生成可执行文件的名称
EXECUTABLE := foo
# 修改LIBS,添加所需要链接的库,以空格分隔,例如 LIBS := pthread rt ssl
LIBS :=# Now alter any implicit rules' variables if you like, e.g.:
#
# 修改CC,改变编译器
CC:=g++
# 修改编译选项
CFLAGS := -g -D_DEBUG -Wall
CXXFLAGS := $(CFLAGS)RM-F := rm -f# You shouldn't need to change anything
below this point.
#
#匹配的文件,默认仅匹配当前目录,可做如下修改
#可添加所需要包含的目录,例如$(wildcard test/*.cpp)
#可添加所支持的后缀文件,例如$(wildcard *.cc)
SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst
%.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
DEPS := $(patsubst %.o,%.d,$(OBJS))
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS))
$(patsubst %.d,%.cpp,$(MISSING_DEPS)))
CPPFLAGS += -MD.PHONY : everything deps objs clean veryclean
rebuildeverything : $(EXECUTABLE)deps : $(DEPS)

objs : $(OBJS)

clean :
@$(RM-F) *.o
@$(RM-F) *.d

veryclean: clean
@$(RM-F) $(EXECUTABLE)

rebuild: veryclean everything

ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS) :
@$(RM-F) $(patsubst %.d,%.o,$@)
endif

-include $(DEPS)

$(EXECUTABLE) : $(OBJS)
$(CC) -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS))

使用时,
1.将所有代码放在一个单独的目录下,例如/code
2.将makefile文件copy一份在/code下
3.执行make,即可生成目标文件foo
其中有几点可自行改变,已在文中用红色文字标出对于小型项目或者平时写写测试代码,用这个makefile实在是方便又快捷

没有评论: