NMAKE生成文件,在子文件夹链接对象文件

问题描述:

我的makefile文件定义了一个链接命令:NMAKE生成文件,在子文件夹链接对象文件

prod_link = $(LINK) $(LINK_FLAGS) -o$(PROD_OUT) $(PROD_OBJS) 

其中$(PROD_OBJS)的形式为目标文件的列表:

PROD_OBJS = objfile1.obj objfile2.obj objfile3.obj ... objfileN.obj 

现在makefile文件本身在我的项目目录的根目录。 在根目录下有对象和列表文件会变得麻烦,我想将它们放在一个子文件夹中。

大厦和OBJ文件outputing到子文件夹的作品,我与后缀和推理这样做:

.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

我不确定NMAKE与GnuMAKE有多相似,但是您可以尝试在您的VPATH中添加“Objects”对象? ('VPATH:= $(VPATH)Objects')。 VPATH是make实用程序用于搜索目标到规则的路径列表。另外什么是$(PROD_OUT)它是一个单一的文件? – BeeBand 2010-04-20 08:37:46

+0

'nmake'似乎不喜欢':='。 'PROD_OUT'是单个最终输出文件,是的。 – Gauthier 2010-04-20 08:53:24

+0

好吧,也许尝试“VPATH =对象”。如何制定一个规则来生成$(PROD_OUT)目标,例如 '$(PROD_OUT):$(PROD_OBJS)(换行符)(制表符)$(LINK)$(LINK_FLAGS)-o $ @ $ BeeBand 2010-04-20 08:58:28

NMA ke是不是 GNUMake,而且相当垃圾。详细信息请参见NMAKE Reference

至于你的问题出(翻译成1.o 2.o 3.od/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)] 

顺便说一句,你的模式规则是骗执行nmake。你说.s.obj:,它说“这里是如何将一个.s文件转换成.obj”,但然后你给的命令实际上创建了一个子文件夹中的对象。您应该已经开始使用.s{Objects\}.obj:的模式规则。有关更多详细信息,请参阅文档(规则中的搜索路径)。

+0

谢谢圣诞节前夕的回答。 “我觉得很浪费”,我同意。我切换到GNU make。 – Gauthier 2010-12-25 22:12:34

非常迟到了,但万一别人运行到了同样的问题:

此错误

makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation 
Stop. 

由事实patsubst语法似乎并没有引起支持由nmake。您可以通过使用

$(var:suffix=replacement) 

,而不是

$(patsubst %suffix,%replacement,$(var)) 

的替代语法解决这个问题(这也是gnumake的有效)。