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

Sma*_*y77 3 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
Run Code Online (Sandbox Code Playgroud)

编辑:我尝试了 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
Run Code Online (Sandbox Code Playgroud)

小智 5

由于您从未告诉 makefilea.o依赖于a.cpp,因此它将无法确定当a.cpp更改时,它应该重建a.o

修复此更改

a.o:
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o
Run Code Online (Sandbox Code Playgroud)

对此

a.o: a.cpp
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o
Run Code Online (Sandbox Code Playgroud)

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