也许我做错了但 make 在makefile看起来像这样拒绝检查依赖项的时间戳。
# 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 nfo :
+ ------------ +
我想要实现的是从当前目录中读取源代码,检查它们是否已被更改,继续编译它们,同时将对象放在../obj而不是当前目录中。
这是位于../src中的makefile,还有另一个用于在父目录中链接的文件。
我想要工作的结构的图形表示
+--- Parent Directory ------+
| | | |
| | | |
bin obj inc src
答案 0 :(得分:2)
你的规则:
$(OBJECTS):$(notdir $(patsubst %.o,%.cpp,$@))
...
不起作用,因为$@
在先决条件列表中没有值。来自the manual:
[自动变量]无法直接在a的先决条件列表中访问 规则。
尝试this:
$(OBJECTS): $(OBJECTD)/%.o : %.cpp
@echo : Compiling $<
@$(CC) $(FL) -c $< -o $@