1

我的 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.

这很奇怪……

4

2 回答 2

1

nmake不是GNUMake,而且相当垃圾。有关详细信息,请参阅NMAKE 参考

就您的问题而言(翻译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:. 有关更多详细信息,请参阅文档(规则中的搜索路径)。

于 2010-12-24T11:23:26.383 回答
0

聚会很晚,但万一其他人遇到同样的问题:

这个错误

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

是由于 nmake 似乎不支持 patsubst 语法。您可以通过使用替代语法来解决这个问题

$(var:suffix=replacement)

代替

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

(这在 gnumake 中也有效)。

于 2015-09-01T21:51:35.377 回答