【问题标题】: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。该文件非常有用!非常感谢。

标签: c++ makefile compilation


【解决方案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 时也是如此。

【讨论】:

    猜你喜欢
    • 2013-04-26
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2022-01-22
    相关资源
    最近更新 更多