nmake makefile,链接子文件夹中的对象文件

nmake makefile,链接子文件夹中的对象文件,makefile,nmake,Makefile,Nmake,My 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

My 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
问题是将
对象
文件夹传递给link命令

我试过:

prod_link = $(LINK) $(LINK_FLAGS) -o$(PROD_OUT) Objects\$(PROD_OBJS)
但只有对象文件列表中的第一个文件才能获取文件夹的名称

如何将
对象
子文件夹传递到列表中的所有文件
$(PROD_OBJS)


编辑

我也试过了

PROD_OBJS = $(patsubst %.ss,Object\%.obj, $(PROD_SRC))
但是得到:

makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.
这很奇怪…

nmake不是GNUMake,而是垃圾。有关详细信息,请参阅

至于你的问题(将
1.o2.o3.o
翻译成
d/1.od/2/od/3.o
),试试看

顺便说一句,你的模式规则对nmake撒谎了。您说
.s.obj:
,它说“这里是如何将.s文件转换为.obj的方法”,但是您给出的命令实际上在子文件夹中创建了对象。您应该使用
.s{Objects\}.obj:
启动模式规则。有关更多详细信息,请参阅文档(规则中的搜索路径)。

nmake不是GNUMake,而是垃圾。有关详细信息,请参阅

至于你的问题(将
1.o2.o3.o
翻译成
d/1.od/2/od/3.o
),试试看


顺便说一句,你的模式规则对nmake撒谎了。您说
.s.obj:
,它说“这里是如何将.s文件转换为.obj的方法”,但是您给出的命令实际上在子文件夹中创建了对象。您应该使用
.s{Objects\}.obj:
启动模式规则。有关更多详细信息,请参阅文档(在规则中搜索路径)。

很晚才到达该方,但万一其他人遇到同样的问题:

这个错误

makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.
是因为nmake似乎不支持patsubst语法。您可以通过使用替代语法来解决这个问题

$(var:suffix=replacement)
而不是

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

(这在gnumake中也是有效的)。

很晚才到派对,但如果其他人遇到同样的问题:

这个错误

makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.
是因为nmake似乎不支持patsubst语法。您可以通过使用替代语法来解决这个问题

$(var:suffix=replacement)
而不是

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

(这在gnumake中也有效)。

我不确定NMAKE与gnumake有多相似,但您可以尝试将
对象添加到您的VPATH中?(
VPATH:=$(VPATH)对象
)。VPATH是make实用程序将用于搜索规则目标的路径列表。还有什么是$(PROD_OUT)是单个文件吗?
nmake
似乎不喜欢
:=
PROD_OUT
是唯一的最终输出文件,是的。好的,可以试试“VPATH=Objects”。还可以制定一个规则来生成$(PROD_OUT)一个目标,例如
$(PROD_OUT):$(PROD_OBJS)(换行)(tab)$(LINK)$(LINK_FLAGS)-o$@$这个错误,是因为
$(PROD_SRC)
之前的空格吗?我也不知道NMAKE,但问题的核心似乎是使用patsubst。我建议在简单的情况下使用patsubst进行实验,验证它是否有效,然后使用它构建PROD_OBJS。(如果这是GNUMake,我会重写对象规则:object/%.obj:%.s…)我不确定NMAKE与GNUMake有多相似,但您可以尝试将
对象添加到VPATH中?(
VPATH:=$(VPATH)对象
)。VPATH是make实用程序将用于搜索规则目标的路径列表。还有什么是$(PROD_OUT)是单个文件吗?
nmake
似乎不喜欢
:=
PROD_OUT
是唯一的最终输出文件,是的。好的,可以试试“VPATH=Objects”。还可以制定一个规则来生成$(PROD_OUT)一个目标,例如
$(PROD_OUT):$(PROD_OBJS)(换行)(tab)$(LINK)$(LINK_FLAGS)-o$@$这个错误,是因为
$(PROD_SRC)
之前的空格吗?我也不知道NMAKE,但问题的核心似乎是使用patsubst。我建议在简单的情况下使用patsubst进行实验,验证它是否有效,然后使用它构建PROD_OBJS。(如果这是GNUMake,我会重写object规则:object/%.obj:%.s…)感谢圣诞夜的答案。“这是相当红润的”,我同意。我改用GNU make。谢谢你给我圣诞夜的答案。“这是相当红润的”,我同意。我转到GNU make。