【发布时间】:2011-07-16 14:26:51
【问题描述】:
我正在做一些 Makefile 重构,并试图找出实现 Makefile 的最简洁方法,该 Makefile 执行以下操作:
- 有一个变量列出了所有源文件(可以是 C 和 C++ 文件)
- 所有对象文件均在 OBJ_DIR 中生成
- 如果对象目录不存在则创建它
这是我目前所拥有的:
...
OBJ_DIR = obj/
BIN_DIR = bin/
PROGRAM = program
SRCS = test1.cpp test2.c
OBJS = $(addprefix $(OBJ_DIR), \
$(patsubst %.cpp, %.o, \
$(patsubst %.c, %.o, $(SRCS))))
$(BIN_DIR)$(PROGRAM) : $(OBJS)
$(CREATE_OUT_DIR)
$(LINK)
$(OBJ_DIR)%.o : %.c
$(CREATE_OBJ_DIR)
$(CCOMPILE)
$(OBJ_DIR)%.o : %.cpp
$(CREATE_OBJ_DIR)
$(CPPCOMPILE)
...
我想为每个 .o 编译消除对 $(CREATE_OBJ_DIR) 的调用。有人知道怎么做吗?我尝试添加它,但它不会构建目标文件:
$(OBJS): | $(OBJ_DIR)
$(OBJ_DIR):
$(CREATE_OBJ_DIR)
【问题讨论】:
-
我发现这种设计存在问题。您如何考虑标头依赖关系?我通常用
src = $(shell find ./ --name "*.cpp")之类的东西编写makefile,并使用GCC-M开关来为我处理依赖关系。这样,我的所有项目都有一个简短的可重复使用的 makefile。至于你的实际问题,为什么不预先创建obj目录呢? -
不完全是一个答案,但您是否已经看过
Makefile的替代品?SConstruct出现在我的脑海中(而且很棒),但是还有很多其他工具可以很好地处理这些问题。 -
@Alexandre:我还打算研究标题依赖项。你有一个很好的例子来说明如何做到这一点吗?
-
一个不错的起点是 mad-scientist.net/make/autodep.html,您可能想要研究的 GCC 选项是
-M的变体。