C/C++Makefile:如何在with.C文件和其他目录中的对象文件之间建立依赖关系



这里是我的.c和.o文件层次结构:

---/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)/$@
clean:
        rm -f $(OBJS) $(DEP) $(EXE)
depend: .depend
.depend: $(SRC)
        rm -f ./.depend
        $(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -MM $^ -MF ./.depend;
include .depend
   

您违反了http://make.mad-scientist.net/rules.html的规则2,这就是为什么它一直在重建它们,认为它们不存在。(在预决条件中列出$(OBJ),在配方链接行中列出$(OBJS),这也有点像makefile的"气味"。)

您需要使用一个规则,将目标文件正确映射到它们的先决条件。

手动或使用vpath

有很多方法可以让手动方法发挥作用,这取决于你想投入多少精力来设置。vpath方法可能会简单一些。

使用vpath应该只需要使用$(OBJS)作为$(EXE)的前提条件,然后添加vpath %.cpp .vpath %.h ../../include或类似的内容。

最新更新