我有一个包含此内容的Makefile
$ cat Makefile
all: locality
locality: src/locality.o
g++ src/locality.o -o locality
locality.o: src/locality.cpp
g++ -O3 -c src/locality.cpp
clean:
rm -rf src/*.o locality
然而,当我运行make
时,我看到一些略有不同的输出!
$ make clean
rm -rf src/*.o locality
$ make
g++ -c -o src/locality.o src/locality.cpp
g++ src/locality.o -o locality
那么-O3
??
答案 0 :(得分:2)
你绊倒了GNU make中的内置规则,即%.o: %.c
。请改用$CFLAGS
。
CFLAGS=-O3
all: locality
locality: src/locality.o
g++ src/locality.o -o locality
clean:
rm -rf src/*.o locality
答案 1 :(得分:1)
Make正在使用隐式规则来创建src/locality.o
因为您没有规则(您在当前目录中只有locality.o
的规则,而不是src
。
这是违反Paul's rules of Makefiles之一的原因:
每个非.PHONY规则必须使用其目标的确切名称更新文件。
为此,您应该在规则中使用$@
来指定目标文件。