【问题标题】:nmake makefile, linking objects files in a subfoldernmake makefile,链接子文件夹中的对象文件
【发布时间】:2010-04-20 08:15:11
【问题描述】:

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

这很奇怪……

【问题讨论】:

  • 我不确定 NMAKE 与 GnuMAKE 有多相似,但您可以尝试将 Objects 添加到您的 VPATH 中? (VPATH:=$(VPATH) Objects)。 VPATH 是 make 实用程序用于搜索规则目标的路径列表。还有什么是 $(PROD_OUT) 是单个文件吗?
  • nmake 似乎不喜欢:=PROD_OUT 是单个最终输出文件,是的。
  • 好的,也许试试“VPATH=Objects”。还不如制定一个规则来生成 $(PROD_OUT) 一个目标,例如$(PROD_OUT):$(PROD_OBJS) (newline)(tab) $(LINK) $(LINK_FLAGS) -o$@ $< 这样,你可以调用 $(PROD_OUT) 作为一个目标,它会构建你的对象,前提是你已经正确设置了 VPATH。这是什么类型的 NMAKE.. 微软?我对 NMAKE 不太熟悉,但我知道它的语法与 gnu MAKE 非常相似。
  • 那个错误,是不是因为$(PROD_SRC)前面有空格?
  • 我也不知道NMAKE,但问题的核心似乎是patsubst的使用。我建议在简单的情况下尝试使用 patsubst,验证它是否有效,然后使用它构造 PROD_OBJS。 (如果这是 GNUMake,我会重写对象规则:Object/%.obj: %.s ...)

标签: makefile nmake


【解决方案1】:

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)]

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

【讨论】:

  • 感谢平安夜的回答。 “相当垃圾”,我同意。我切换到 GNU make。
【解决方案2】:

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

这个错误

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

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

$(var:suffix=replacement)

而不是

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

(这在 gnumake 中也有效)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多