这里是我的.c和.o文件层次:C/C++ Makefile:如何在.c文件和其他目录中的目标文件之间建立依赖关系?
---/src/IRBuild/main.c
func1.c
func2.c
---/inclue/main.h
func1.h
func2.h
---/build/IRBuild/main.o
func1.o
func2.o
irbuild
下面是我在〜/ src目录/ IRBuild/Makefile中,我不得不建立编译.c和.h文件的依赖性,这意味着每当.C或.h文件被更改。 “make”会重建对象文件。但因为我输出.o文件到〜/ build/IRBuild /,而不是当前目录,“make”会在我每次创建时重建所有的.o文件。
我应该如何在其他目录中使用.o文件构建依赖关系?只有在.c,.h或.o文件发生更改时才重新编译特定文件?
在这里呆了两天,非常感谢!
EXE=irbuild
# G++ as default compiler
CC=g++
# Compile time flags
CXXFLAGS = -g -Wall
# Library paths in addition to /usr/lib
LFLAGS=-std=c++0x
# Libraries to link into executable:
#LIBS = -lmylib -lm
# Include files directory other than /usr/include
INCLUDES=-I../../include/
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
DEP=$(OBJ:.o=.d)
BUILD=../../build/IRBuild
TESTS=../../tests/
OBJS :=$(foreach obj, $(OBJ), $(BUILD)/$(obj))
.PHONY: depend clean
all: $(EXE)
cp $(EXE) $(TESTS)
$(EXE): $(OBJ)
$(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -o $(EXE) $(OBJS)
.cpp.o:
$(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -c $< -o $(BUILD)/[email protected]
clean:
rm -f $(OBJS) $(DEP) $(EXE)
depend: .depend
.depend: $(SRC)
rm -f ./.depend
$(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -MM $^ -MF ./.depend;
include .depend
谢谢Etan,你的意思是这条规则违反了规则2吗? (代码).cpp.o: $(CC)$(CXXFLAGS)$如果我删除$(BUILD),那么$ @只是生成目标文件本身,没有路径信息。 而vpath正在处理prerequirement的权利?但我正在谈论依赖关系,我如何在其他目录中使用.o文件构建依赖关系? – MartinGGWW 2014-10-02 15:26:20
是的,该食谱线。你的食谱需要生成*精确*'$ @'而不是它的变体。正确的,'vpath'是针对prereqs的。这就是为什么当我提到我说你使用'$(OBJS)'作为prereqs,因为在文件名中有'$(BUILD)'路径,然后让'vpath'找到这些对象文件的匹配源。 – 2014-10-02 15:44:30
Etan,它的工作原理! 我添加了“vpath%.o ../../build/IRBuild”,然后它就起作用了!谢谢!我没有15个名誉,所以我不能给你投票。 – MartinGGWW 2014-10-02 15:57:55