我在编写Makefile方面几乎是新手,因此对可能出现的小错误感到抱歉。 即使源代码没有任何变化,我的Makefile仍会继续重新编译可执行文件(.out)。 目标对其他对象有一些依赖性。无论如何,这些对象不会重新编译相对的源文件(就像应该的那样)。 那么,为什么目标会重新编译.out文件呢?
任何其他建议将不胜感激。
# -*- Makefile -*-
CC:= nvcc
CFLAGS:= -std=c++14 -g -DMEASURES
ALLFLAGS:= $(CFLAGS) -Iinclude/
LOWPAR:= $(ALLFLAGS) -DLOWPAR
BIN:=bin/
SRC:=src/
INCLUDE:=include/
.PHONY: future managed stream clean
####DEVICE####
#cos future, stream, managed
future: $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o
$(CC) $(ALLFLAGS) $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o -o $(BIN)future.out
managed: $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o
$(CC) $(ALLFLAGS) $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o -o $(BIN)managed.out
stream: $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o
$(CC) $(ALLFLAGS) $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o -o $(BIN)stream.out
$(BIN)main_cos.o: $(SRC)main_cos.cpp $(INCLUDE)cosFutStr.h $(INCLUDE)cudaUtils.h
$(CC) $(ALLFLAGS) -c $(SRC)main_cos.cpp -D$(shell echo $(MAKECMDGOALS) | tr a-z A-Z) -o $(BIN)main_cos.o
$(BIN)farmkernels.o: $(SRC)farmkernels.cu $(INCLUDE)cosFutStr.h $(INCLUDE)cudaUtils.h
$(CC) $(ALLFLAGS) -c $(SRC)farmkernels.cu -o $(BIN)farmkernels.o
$(BIN)cudaUtils.o: $(SRC)cudaUtils.cpp $(INCLUDE)cudaUtils.h
$(CC) $(ALLFLAGS) -c $(SRC)cudaUtils.cpp -o $(BIN)cudaUtils.o
####clean####
clean:
rm -f $(BIN)*.o
rm -f $(BIN)*.out
例如,当我输入
make future
我第一次编译所有内容:
nvcc -std=c++14 -g -DMEASURES -Iinclude/ -c src/main_cos.cpp -DFUTURE -o bin/main_cos.o
nvcc -std=c++14 -g -DMEASURES -Iinclude/ -c src/farmkernels.cu -o bin/farmkernels.o
nvcc -std=c++14 -g -DMEASURES -Iinclude/ -c src/cudaUtils.cpp -o bin/cudaUtils.o
nvcc -std=c++14 -g -DMEASURES -Iinclude/ bin/main_cos.o bin/farmkernels.o bin/cudaUtils.o -o bin/future.out
如果我不更改代码中的任何内容并立即重新键入,以创造未来,那么我希望诸如“什么都不做……”之类的东西。 但是我得到的是:
nvcc -std=c++14 -g -DMEASURES -Iinclude/ bin/main_cos.o bin/farmkernels.o bin/cudaUtils.o -o bin/future.out
答案 0 :(得分:5)
您明确地告诉make
始终在不考虑依赖项时间戳的情况下进行重建:
.PHONY: future managed stream clean
make
正在执行您的要求。
如果您想要好的命名目标而不引起重建,请不要为命名目标编写规则。相反,给他们依赖。您已经注意到,.PHONY
不会强制重建所有依赖关系,它仅运行直接规则。
.PHONY: future managed stream clean
future: $(BIN)future.out
$(BIN)future.out: $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o
$(CC) $(ALLFLAGS) $+ -o $@
(也根据“不要重复自己”的原则使用自动变量)
答案 1 :(得分:2)
您已指示future
是“语音目标”。这意味着:
future
与实际文件不符,即future
是否为最新日期future
永远不会是最新的future
时,都必须为其执行命令并且您的链接命令在future
目标下列出;这样它每次都会重新运行。
有关.PHONY
的更深入的说明,请参见:What is the purpose of .PHONY in a makefile?
两个选项:
future
目标的命令会生成$(BIN)future.out
,对吗?因此,将其替换为$(BIN)future.out
目标,然后进行构建。添加一个$(BIN)future.out
目标,但是为了方便起见,请勿直接构建该目标-让future
目标依赖它,例如@BenVoigt建议:
.PHONY: future other_pho ny_target s_here
future: $(BIN)future.out
$(BIN)future.out: $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o
$(CC) $(ALLFLAGS) $(BIN)main_cos.o $(BIN)farmkernels.o $(BIN)cudaUtils.o -o $(BIN)future.out