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 $<
扩展为第一个先决条件,在本例中为 sub.cpp
。所以这是规则使用的唯一源文件,即使在尝试构建 add.o
时也是如此。
【讨论】:
以上是关于Makefile 中的 $(objs): %.o : %.cpp 和 $(objs): $(objs:.o=.cpp) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
Makefile 文件中的:obj-$(CONFIG_TEST) += test.o,这一类的是什么意思?