2016-11-12 88 views
1

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

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修改建议(我想同自己之前,我写了这个问题),这是结果:

[email protected]: ~/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; 
}[email protected]: ~/mypath$ make 
g++-5.3 a.o -o a 
[email protected]: ~/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 
+0

'。所以改变'a.o:'这一行来读取'a.o:a.cpp'。还要改变目标'build',这取决于'a',而不是'a.o',并添加一个目标'a:a.o'来完成链接。 – Peter

回答

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,它将不能确定当a.cpp改变时,它应该重建a.o

让我知道如果它不起作用,我对我的makefiles有点生疏。

+0

没有。我在a.cpp中犯了一个语法错误,当我写'make'时发生这种情况:'g ++ - 5.3 a.o -o a'。这会比应该花费更多的时间: - /。我正在使用为x86_64-redhat-linux-gnu构建的GNU make 3.81。 – Smarty77

1

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

同样,如果您定义的规则build: a.o,告诉令,为了建立一个名为build目标,应该看到,如果一个名为build文件是否存在,如果a.o比它更新。如果文件build不存在,那么它将运行您提供的配方。

由于您的配方,$(COMPILER) $(CXXFLAGS) a.o -o a实际上并没有创建一个名为build的文件,它总是过期并且将始终运行。

你必须确保你的食谱实际上是创建你试图构建目标的名称:a.o`需要靠`a.cpp`

a: a.o 
     $(COMPILER) a.o -o a 
相关问题