为什么这个简单的makefile不会在更改时重建源代码?

时间:2016-11-12 18:50:52

标签: c++ makefile

我写了这个简单的makefile,它工作正常,直到我想做一些更改并将它们应用到二进制文件中。然后我需要再做'make clean'和'make',因为obj。文件不会被重建。虽然它似乎是一个简单的任务到目前为止我没有修改它以使obj。隐式重建文件(所以我修改源代码时只能编写'make'。)

COMPILER=g++-5.3
CXXFLAGS=-std=c++11 -O2 -pedantic

build : a.o
     $(COMPILER) a.o -o a

a.o:
     $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o

clean :
    rm -f *.o *~ a

编辑:我尝试过Omada建议的更改(在我写这个问题之前我自己尝试过这样做)这就是结果:

me@pc: ~/mypath$ cat a.cpp
#include <iostream>
int main(int argc, char* argv[])
{
    if ( argc!=2 ){
        std::ceaaarr<<"Prrogram expects 1 argument\n";
        return 1;
    }
    return 0;
}me@pc: ~/mypath$ make
g++-5.3 a.o -o a
me@pc: ~/mypath$ cat Makefile
#init

COMPILER=g++-5.3
CXXFLAGS=-std=c++11 -O2 -pedantic

build: a.o
        $(COMPILER) a.o -o a

a.o: a.cpp
        $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o

clean:
        rm -f *.o *~ a

2 个答案:

答案 0 :(得分:4)

只需更改此

a.o:
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o

到这个

a.o: a.cpp
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o

由于您从未告诉a.o取决于a.cpp的makefile,因此无法确定a.cpp更改时,它应该重建a.o。< / p>

如果它不起作用,请告诉我,我的makefile上有点生锈。

答案 1 :(得分:1)

如果你告诉make做什么,它会按照你说的去做。如果您编写的规则具有构建a.o并且没有列出先决条件的目标,那么make认为目标没有先决条件:在这种情况下,如果目标(a.o)存在,那么make将假设它是最新的。 Omada告诉您如何通过添加先决条件来避免这种情况。您也可以使用make已经知道如何从.cpp文件创建目标文件的内置规则,而不是定义自己的规则(但是,它使用CXX变量不是COMPILER)。

同样,如果你定义一个规则build: a.o,那就告诉make为了构建一个名为build的目标,它应该看看一个名为build的文件是否存在以及是否{{} 1}}比它更新。如果文件a.o不存在,那么它将运行您提供的食谱。

由于您的食谱build实际上并未创建名为$(COMPILER) $(CXXFLAGS) a.o -o a的文件,因此它始终会过时并始终运行。

您必须确保您的食谱实际上创建了您尝试构建的目标的名称:

build