我是Makefile的新手(实际上是编程)。我有以下makefile: -
$ cat Makefile
VER = Debug
main: main.o Time.o
g++ Object\ Code/main.o Object\ Code/Time.o -o ../$(VER)/main
main.o: main.cpp
g++ -c main.cpp -o Object\ Code/main.o
Time.o: Time.cpp Time_.h
g++ -c Time.cpp -o Object\ Code/Time.o
clean:
rm Object\ Code/*.o
rm ../$(VER)/main
makefile在src文件夹中
$ ls && pwd
main.cpp Makefile Object Code Time.cpp Time_.h
/home/Rahul/Devlopment/WorkSpace/Test C++/src
对象代码是src中的目录。
$ ls ..
Debug Release src
但是,当我只更改一个文件并尝试使用make时,它会编译所有文件: -
$ make
g++ -c main.cpp -o Object\ Code/main.o
g++ -c Time.cpp -o Object\ Code/Time.o
g++ Object\ Code/main.o Object\ Code/Time.o -o ../Debug/main
$ touch Time
Time.cpp Time_.h
$ touch Time_.h
$ make
g++ -c main.cpp -o Object\ Code/main.o
g++ -c Time.cpp -o Object\ Code/Time.o
g++ Object\ Code/main.o Object\ Code/Time.o -o ../Debug/main
$ make
g++ -c main.cpp -o Object\ Code/main.o
g++ -c Time.cpp -o Object\ Code/Time.o
g++ Object\ Code/main.o Object\ Code/Time.o -o ../Debug/main
作为一个完整的菜鸟我不知道。请帮帮我。
答案 0 :(得分:3)
文件main.o
与Object\ Code/main.o
不是同一个文件,对于其他文件也是如此,我强烈建议您在开发程序时避免文件名和目录中的空格。设置make以使用单独的目录并不是完全简单的,在实现多个目录之前,应该让makefile在单个目录下工作。
答案 1 :(得分:1)
当您构建目标时,make需要您的配方创建与目标相同的文件:否则您就是在撒谎。像这样的规则:
main.o: main.cpp
<recipe>
由make解释为“如果你想构建一个文件main.o
并且你有一个文件main.cpp
并且main.o
已经过时,那么你可以运行这个食谱<recipe>
要这样做“。但是,您的食谱不会构建main.o
,而是构建Object code/main.o
。所以下次make完成后,它想要构建main.o
并且它不存在,所以make尝试再次构建它......等等。
项目#1:不可能在makefile中使用包含空格的路径。
项目#2:你应该总是使用像$@
等自动变量来确保你的规则构建与预期相同的东西。
项目#3:将源代码编译成硬编码目录中的目标文件,然后将可执行文件写入变量目录(如$(Ver)
)
你的makefile应该是这样的:
CXX = g++
SOURCES = main.cpp Time.cpp
VER = Debug
$(VER)/main: $(SOURCES:%.cpp=$(VER)/%.o)
$(CXX) -o $@ $^
$(VER)/%.o : %.cpp
$(CXX) -o $@ -c $<
clean:
rm -rf $(VER)
有关所有这些事项的详细信息,请参阅The GNU make manual。