代码之家  ›  专栏  ›  技术社区  ›  Gauthier

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

  •  0
  • Gauthier  · 技术社区  · 14 年前

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

    但只有对象文件列表中的第一个文件才能获取文件夹的名称。

    我怎么通过 物体 列表中所有文件的子文件夹 美元(产品) ?


    编辑

    我也试过了

    PROD_OBJS = $(patsubst %.ss,Object\%.obj, $(PROD_SRC))
    

    但得到:

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

    这很奇怪…

    2 回复  |  直到 8 年前
        1
  •  0
  •   bobbogo    14 年前

    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: . 查看文档了解更多详细信息( 规则中的搜索路径 )

        2
  •  0
  •   Sam    9 年前

    参加聚会很晚,但如果其他人遇到同样的问题:

    这个错误

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

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

    $(var:suffix=replacement)
    

    而不是

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

    (这在Gnumake中也有效)。