gpt4 book ai didi

linux - 为什么我的目标总是被重新编译,即使代码没有任何变化?

转载 作者:IT王子 更新时间:2023-10-29 01:04:33 27 4
gpt4 key购买 nike

我几乎是编写 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

如果我不更改代码并立即重新键入 make future,我希望得到类似“nothing to be done for...”的结果。我得到的是:

nvcc -std=c++14 -g -DMEASURES -Iinclude/  bin/main_cos.o bin/farmkernels.o bin/cudaUtils.o -o bin/future.out

最佳答案

你特别告诉 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 $@

(也根据“不要重复自己”原则使用自动变量)

关于linux - 为什么我的目标总是被重新编译,即使代码没有任何变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com