当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题] 问一个关于万能makefile的问题。
帖子发表于 : 2008-08-02 13:04 

注册: 2008-06-28 15:46
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
我从网上找了一个万能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)



页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-08-04 1:09 

注册: 2005-10-20 9:19
帖子: 86
送出感谢: 0 次
接收感谢: 0 次
但在写puss项目时也用到了类似的做法,不是万能的Makefile,但能用了,我对shell不熟,只用到了wildcard这一个shell函数,我的中间文件都放在debug或release目录下,给你贴下源码吧, http://code.google.com/p/ljedit/source/browse/trunk/puss/extends/dndopen/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 文件



页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-08-05 18:37 

注册: 2008-06-28 15:46
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
谢谢你提供的makefile,我改了一下用来替换上面那个工作了。
谢谢


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-08-05 18:40 
头像

注册: 2007-03-13 11:23
帖子: 1343
送出感谢: 0 次
接收感谢: 0 次
不如换个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/


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译