Gnu Make的递归性和朋友

Gnu Make's recursiveness and friends

本文关键字:朋友 递归 Make Gnu      更新时间:2023-10-16

也许我做错了什么,但当makefile看起来像这样时,make拒绝检查依赖项的时间戳。

# This makefile won't update the objects if you modify the .cpp files
# and it will only create them if they do not exist.
CC=g++
FL=-g
OBJECTD=../obj
SOURCED=../src
# Get all .cpp files in ../src
SOURCES=$(wildcard *.cpp)
# Convert .cpp to .o then add ../obj in front
OBJECTS=$(addprefix $(OBJECTD)/,$(patsubst %.cpp,%.o,$(SOURCES)))
# You sir must execute yourself whether you like it or not
.PHONY:all
all:$(OBJECTS)
    @echo : Leaving `src`

# This wont work as expected ...
# @echo : Compiling $(notdir $(patsubst %.o,%.cpp,$@))
# echoes Compiling logger.cpp
# But $(notdir $(patsubst %.o,%.cpp,$@)) will not be parsed
# correctly
$(OBJECTS):$(notdir $(patsubst %.o,%.cpp,$@))
    @echo : Compiling $(notdir $(patsubst %.o,%.cpp,$@))
    @$(CC) $(FL) -c $(notdir $(patsubst %.o,%.cpp,$@)) -o $@

我相信它不会接受$(notdir $(patsubst %.o,%.cpp,$@))

即使文件上说

在具有多个目标的模式规则中(请参阅模式规则简介),"$@"是导致规则要运行的配方


分别对每个文件进行编译,效果很好
例如:

../obj/logger.o:logger.cpp
    @echo : Compiling $<
    @$(CC) $(FL) -c $< -o $@


+------------+
eXtra信息
+------------+


我试图实现的是从curect目录中读取源代码,检查它们是否已更改(如果已更改),继续编译它们,同时将对象放在/obj而不是当前目录
这是位于..中的生成文件/src,在父目录中还有另一个用于链接的src


我想在上工作的结构的图形表示

 +--- Parent Directory ------+
 |        |        |         |
 |        |        |         |
bin      obj      inc       src

您的规则:

$(OBJECTS):$(notdir $(patsubst %.o,%.cpp,$@))
    ...

不起作用,因为$@在必备组件列表中没有值。来自手册:

[自动变量]不能在的先决条件列表中直接访问规则

试试这个:

$(OBJECTS): $(OBJECTD)/%.o : %.cpp
    @echo : Compiling $<
    @$(CC) $(FL) -c $< -o $@