即使文件未被更改,当.o文件放在其他floder中时,Makefile也会编译所有文件

时间:2017-11-16 16:54:12

标签: c++ makefile

我是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

作为一个完整的菜鸟我不知道。请帮帮我。

2 个答案:

答案 0 :(得分:3)

文件main.oObject\ 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