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