我的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.
这很奇怪......
答案 0 :(得分:0)
nmake 不 GNUMake,而且相当垃圾。有关详细信息,请参阅NMAKE Reference。
就问题而言(将1.o 2.o 3.o
翻译为d/1.o d/2/o d/3.o
),请尝试
OBJS= 1.o 2.o 3.o
# Looks wierd I know, but basically change ' ' to ' d/'
# (and it's not very robust!)
OBJS_WITH_PREFIX= d/$(OBJS: = d/)
!ERROR [$(OBJS_WITH_PREFIX)]
顺便说一句,你的模式规则是骗人的。你说.s.obj:
,它说“这里是如何将.s文件转换为.obj”,但是你给出的命令实际上是在子文件夹中创建对象。您应该已使用.s{Objects\}.obj:
启动了模式规则。有关详细信息,请参阅文档(规则中的搜索路径)。
答案 1 :(得分:0)
Very late to the party, but in case anyone else runs into the same problem:
This error
makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.
is caused by the fact that the patsubst syntax doesn't seem to be supported by nmake. You can get around this by using the alternative syntax
$(var:suffix=replacement)
instead of
$(patsubst %suffix,%replacement,$(var))
(this is also valid in gnumake).