Makefile中$(objs):%.o:%.cpp和$(objs):$(objs:.o = .cpp)之间的区别是什么

时间:2019-05-05 03:07:50

标签: c++ makefile compilation

我在当前目录中有add.c sub.c,并通过makefile对其进行编译。

我执行以下操作:

  

程序1:

     
    

objs = $(patsubst%.cpp,%。o,$(通配符* .cpp))

         

$(objs):%.o:%。cpp

         

g ++ -o $ @ -c $ << / p>   

     

程序2:

     
    

objs = $(patsubst%.cpp,%。o,$(通配符* .cpp))

         

$(objs):$(objs:.o = .cpp)

         

g ++ -o $ @ -c $ << / p>   

程序1编译成功。但是程序2获得以下命令:

  

g ++ -o sub.o -c sub.cpp

     

g ++ -o add.o -c sub.cpp

那么这两个程序之间有什么区别?

1 个答案:

答案 0 :(得分:1)

makefile 1中的规则等效于

sub.o: sub.cpp
    g++ -o $@ -c $<

add.o: add.cpp
    g++ -o $@ -c $<

正常工作。

makefile 2中的规则扩展为

sub.o add.o: sub.cpp add.cpp
    g++ -o $@ -c $<

其中说,这两个目标的每个 都取决于两个源文件。请注意,automatic variable $<扩展到第一个前提条件,在本例中为sub.cpp。因此,即使尝试构建add.o,这也是该规则使用的唯一源文件。