Makefile 中的 $(objs): %.o : %.cpp 和 $(objs): $(objs:.o=.cpp) 有啥区别

Posted

技术标签:

【中文标题】Makefile 中的 $(objs): %.o : %.cpp 和 $(objs): $(objs:.o=.cpp) 有啥区别【英文标题】:What is the diferrence between $(objs): %.o : %.cpp and $(objs): $(objs:.o=.cpp) in MakefileMakefile 中的 $(objs): %.o : %.cpp 和 $(objs): $(objs:.o=.cpp) 有什么区别 【发布时间】:2019-05-05 03:07:49 【问题描述】:

我在当前目录下有add.c sub.c,通过makefile编译。

我执行以下操作:

程序 1:

objs=$(patsubst %.cpp, %.o, $(wildcard *.cpp))

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

g++ -o $@ -c $

程序 2:

objs=$(patsubst %.cpp, %.o, $(wildcard *.cpp))

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

g++ -o $@ -c $

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

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

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

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

【问题讨论】:

第二次编译sub.cpp 覆盖add.o 是故意的还是一个错字? 读取GNU make: Multiple Targets。尤其是第一句和最后一句。 @ matt。该文件非常有用!非常感谢。 【参考方案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 $<

这表示这两个目标中的 每个 都依赖于 both 源文件。请注意,automatic variable $&lt; 扩展为第一个先决条件,在本例中为 sub.cpp。所以这是规则使用的唯一源文件,即使在尝试构建 add.o 时也是如此。

【讨论】:

以上是关于Makefile 中的 $(objs): %.o : %.cpp 和 $(objs): $(objs:.o=.cpp) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Makefile 文件中的:obj-$(CONFIG_TEST) += test.o,这一类的是什么意思?

makefile中的多个冒号和等号(需要解释)

Makefile vpath %.o 找不到 obj 文件

makefile介绍1.0

转: 静态模式makefile中$(cobjs): $(obj)/%.o: $(src)/%.c

makefile 文件模板