从stem中的文件名生成makefile目标依赖项

Posted

技术标签:

【中文标题】从stem中的文件名生成makefile目标依赖项【英文标题】:Generating a makefile target dependency from the filename in a stem 【发布时间】:2011-02-18 20:21:34 【问题描述】:

您好,我正在创建一个 makefile,其中每个 .o 都表示为另一个目录的相对路径,并且依赖于本地目录中的 .cpp 文件。我对这个问题的理解是我不能在规则定义中使用函数,所以规则:

%.o: %.cpp

导致先决条件 .cpp 与 .o 位于同一目录中,而 .o 不是 cpp 实际所在的位置。例如:

../../Tmp/MyClass.o: ../../Tmp/MyClass.cpp

../../Tmp/MyClass.o: MyClass.cpp

最后,位于另一个目录中的输出依赖于 .o,因此它们必须从一开始就具有完整的相对路径信息:

OBJS := $(addprefix ../../../Tmp/XCode/$PLATFORM/$CONFIGURATION/, $(addsuffix .o, $(basename $SRCS)))

$OUTPUT: $OBJS ; $AR $@ $OBJS

谢谢!

【问题讨论】:

【参考方案1】:

我认为 kristi 的解决方案会奏效,但这里有另一种方法可以做同样的事情:

# Here's how you do it:
OBJS := $(addprefix ../../../Tmp/XCode/$PLATFORM/$CONFIGURATION/, $(addsuffix .o, $(basename $SRCS)))

# Here's a slightly cleaner way:
BASEPATH = ../../../Tmp/XCode/$(PLATFORM)/$(CONFIGURATION)
OBJS := $(patsubst %.cc,$(BASEPATH)/%.o,$(SRCS))

# And here's the rule:
$(OBJS): $(BASEPATH)/%.o: %.cc
    whatever...

【讨论】:

【参考方案2】:

这应该可行

../../Tmp/%.o: %.cpp

或者使用变量

builddir := ../../Tmp
$(builddir)/%.o: %.cpp

【讨论】:

嗨,克里斯蒂,感谢您的回复。不幸的是,这不起作用,因为: 哎呀,按回车键发布了评论而不是换行符。这不起作用,因为: $OUTPUT: $OBJS $AR $@ $OBJS 输出依赖于.o,因此它们都需要从头开始包含的路径。 .o 路径通过以下方式生成:OBJS := $(addprefix ../../../Tmp/XCode/$PLATFORM/$CONFIGURATION/, $(addsuffix .o, $(basename $SRCS )))

以上是关于从stem中的文件名生成makefile目标依赖项的主要内容,如果未能解决你的问题,请参考以下文章

从 MSVC 输出生成 Makefile 依赖项

makefile中的特殊符号及关键字

使用 Makefile、源代码生成器并使用 gcc 生成依赖项

在LINUX中Makefile中的依赖文件放在啥地方? 生成的目标文件在啥地方?makefile 是啥类型的文件?

Makefile 包含基于 Debug / Release 目标的依赖项

为啥在 makefile 中不生成依赖项?