[问题] 问一个关于万能makefile的问题。

软件和网站开发以及相关技术探讨
回复
myyxm
帖子: 7
注册时间: 2008-06-28 15:46

[问题] 问一个关于万能makefile的问题。

#1

帖子 myyxm » 2008-08-02 13:04

我从网上找了一个万能makefile的文件,经过自己改动后,已经可以使用。但是当已执行后,编译生成的所有.o和.d文件都放在的和makfile的同一层目录里面。
我想把它该到放到obj和dep文件夹下,怎么改。那位有经验告诉我以下。

makefile如下

代码: 全选

# 用户自定义的地方 #
PROG :=  proj                     #生成程序名
LIBS := `sdl-config --libs`  -lSDL_image -lSDL_ttf -lSDL_mixer                   #需要的库文件
CFLAGS := `sdl-config --cflags` -I/usr/include/SDL  -g -D_DEBUG                  #编译器参数,包括加入头文件目录
CXXFLAGS := $(CFLAGS)
CC := g++
CXX := g++
srcdir =  *.cpp src/*.cpp src/basic/*.cpp #这个地方需要手动加目录
# 准备给下列规则的参数 #
#(变量用函数赋值,才能展开*.c,但如果是依赖关系,直接在:后写通配符*.c就可以展开。其他有*, ? 和 [...])
VPATH =  src:src/basic #这个地方需要自己手动加目录(那位高人给该以下,可以使用上面的srcdir变量直接生成这)
SOURCE := $(wildcard $(srcdir))                #源文件
objs := $(patsubst %.cpp, %.o, $(SOURCE)) #目标文件
OBJS := $(notdir $(objs))
#OBJS := $(addprefix obj/,$(notdir $(objs)))
L_LIBS := $(LIBS)       #对库名加-l前缀
DEPS := $(patsubst %.o, %.d, $(OBJS))    #.d文件
#DEPS := $(patsubst %.o, %.d, $(notdir $(OBJS)))  
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)), $(DEPS)) #得到缺少的.d文件,这由于自己不小心删除了一个.d
CPPFLAGS += -MD                          #这样在.c->.o时,会生成.d文件


.PHONY: all
all:$(PROG)
# 就一条规则,而其他的都采用隐式规则 #
$(PROG): $(OBJS)
	$(CC) $(CFLAGS) $^ -o $@ $(L_LIBS)

# 当.c有,而.d没有时,这里就会起作用
ifneq ($(MISSING_DEPS), )

$(MISSING_DEPS):
	rm -rf $(patsubst %.d, %.o, $@)
endif

# 把各个.o的依赖导入(看看各个.d文件就知道导入的是啥,就是规则格式。这里的$(DEPS)文件是预处理器生成的)
-include $(DEPS)


# 两个假象目的,都属于每次都想让它执行的,所以加入.PHONY #
.PHONY: clean rebuild
clean:
	rm -rf $(OBJS) $(DEPS) $(PROG)
rebuild: clean $(PROG)

louis315
帖子: 86
注册时间: 2005-10-20 9:19

#2

帖子 louis315 » 2008-08-04 1:09

但在写puss项目时也用到了类似的做法,不是万能的Makefile,但能用了,我对shell不熟,只用到了wildcard这一个shell函数,我的中间文件都放在debug或release目录下,给你贴下源码吧, http://code.google.com/p/ljedit/source/ ... n/Makefile

代码: 全选

# makefile
#
# usage :
#     build debug version   : make
#     build release version : make BUILD=release
#

ifeq ($(OS), Windows_NT)
       PLATFORM = win32
endif

CXXFLAGS = -g -Wall
OBJPATH = debug                    # debug版本的中间目录

ifeq ($(BUILD), release)
       CXXFLAGS = -O3 -Wall
       OBJPATH = release          # release版本的中间目录
endif

# gtk
#
CXXFLAGS += `pkg-config --cflags gtk+-2.0`
LIBS += `pkg-config --libs gtk+-2.0`

# project
#
CXXFLAGS += -I../../include

SRCS = $(wildcard src/*.cpp)     # 源文件为src/*.cpp

OBJS = $(SRCS:%.cpp=$(OBJPATH)/%.o)    # 目录文件放在中间目录

TARGET = ../../bin/extends/dndopen.ext

all : $(TARGET)

$(TARGET) : $(OBJS)
       $(CXX) $(CXXFLAGS) -shared -o $@ $^ $(LIBS)

clean :
       rm -f $(TARGET)
       rm -rf $(OBJPATH)

$(OBJPATH)/%.o : %.cpp    # 生成.o文件
       @mkdir -p $(dir $@)
       $(CXX) $(CXXFLAGS) $(GTKINCS) -o $@ -c $<

$(OBJPATH)/%.d : %.cpp    # 生成.d文件
       @echo $(CXX) -MM -o $@ -c $<
       @rm -f $@
       @mkdir -p $(dir $@)
       @$(CXX) $(CXXFLAGS) -MM -MT '$@ $(basename $@).o' $< -o $@

-include $(SRCS:%.cpp=$(OBJPATH)/%.d)    # include .d 文件

myyxm
帖子: 7
注册时间: 2008-06-28 15:46

#3

帖子 myyxm » 2008-08-05 18:37

谢谢你提供的makefile,我改了一下用来替换上面那个工作了。
谢谢
头像
kofshower
帖子: 1343
注册时间: 2007-03-13 11:23
联系:

#4

帖子 kofshower » 2008-08-05 18:40

不如换个cmake来做自动工程.
还可以生成多个平台的make文件
KDE就是用这个的.
"We are all in the mud, but some of us are looking at the stars." (Oscar Wilde)
We are not born for ourselves.
人生天地间,并非为自己
Homepage:http://sites.google.com/site/polarisnotme/
回复