这是我的.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时,“ 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
您违反了规则2,http://make.mad-scientist.net/rules.html
因此为什么规则2认为它们不存在就一直重建它们。($(OBJ)
在先决条件和$(OBJS)
配方链接行中列出的内容也有点makefile“气味”。)
您需要使用一条规则,该规则将目标文件正确映射到其先决条件。
手动或使用vpath
。
有多种方法可以使手动方法起作用,具体取决于您要花费多少精力进行设置。该vpath
方法可能会容易一些。
使用vpath
应该只需要使用$(OBJS)
作为$(EXE)
先决条件,然后添加vpath %.cpp .
和vpath %.h ../../include
或类似的东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句