【发布时间】:2010-04-20 08:15:11
【问题描述】:
我的 makefile 定义了一个链接命令:
prod_link = $(LINK) $(LINK_FLAGS) -o$(PROD_OUT) $(PROD_OBJS)
其中$(PROD_OBJS) 是以下形式的目标文件列表:
PROD_OBJS = objfile1.obj objfile2.obj objfile3.obj ... objfileN.obj
现在 makefile 本身位于我的项目目录的根目录中。 将对象和列表文件放在根目录会很麻烦,我想将它们放在子文件夹中。
构建 obj 文件并将其输出到子文件夹有效,我正在使用后缀和推理:
.s.obj:
$(ASSEMBLY) $(FLAGS) $*.s -o Objects\$*.obj
问题是将Objects文件夹传递给链接命令。
我试过了:
prod_link = $(LINK) $(LINK_FLAGS) -o$(PROD_OUT) Objects\$(PROD_OBJS)
但只有目标文件列表中的第一个文件获得文件夹的名称。
如何将Objects 子文件夹传递给我列表$(PROD_OBJS) 的所有文件?
编辑
我也试过了
PROD_OBJS = $(patsubst %.ss,Object\%.obj, $(PROD_SRC))
但是得到了:
makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.
这很奇怪……
【问题讨论】:
-
我不确定 NMAKE 与 GnuMAKE 有多相似,但您可以尝试将
Objects添加到您的 VPATH 中? (VPATH:=$(VPATH) Objects)。 VPATH 是 make 实用程序用于搜索规则目标的路径列表。还有什么是 $(PROD_OUT) 是单个文件吗? -
nmake似乎不喜欢:=。PROD_OUT是单个最终输出文件,是的。 -
好的,也许试试“VPATH=Objects”。还不如制定一个规则来生成 $(PROD_OUT) 一个目标,例如
$(PROD_OUT):$(PROD_OBJS) (newline)(tab) $(LINK) $(LINK_FLAGS) -o$@ $<这样,你可以调用 $(PROD_OUT) 作为一个目标,它会构建你的对象,前提是你已经正确设置了 VPATH。这是什么类型的 NMAKE.. 微软?我对 NMAKE 不太熟悉,但我知道它的语法与 gnu MAKE 非常相似。 -
那个错误,是不是因为
$(PROD_SRC)前面有空格? -
我也不知道NMAKE,但问题的核心似乎是patsubst的使用。我建议在简单的情况下尝试使用 patsubst,验证它是否有效,然后使用它构造 PROD_OBJS。 (如果这是 GNUMake,我会重写对象规则:Object/%.obj: %.s ...)