Batch file 在其他目录中更改依赖头文件时编译和链接

Batch file 在其他目录中更改依赖头文件时编译和链接,batch-file,makefile,project-management,dos,Batch File,Makefile,Project Management,Dos,我有3个关于编译和链接我的项目的问题,步骤更少 首先,我的项目如下:(我使用Watcom C编译//链接我的项目) 目录“MyProject”包含不同模块和一些文件的3个子目录: 目录“A”(包括A.h和A.c) 目录“B”(包括B.h和B.c) 目录“C”(包括C.h和C.C) 我的.c和我的.h 我的lnk 生成文件 在每个子目录中都有一个对应的makefile [Q1]假设我更新了目录a中的a.h,并且目录b中的b.c引用了a.h,那么我最初的步骤将是: 在目录A中编译(生成obj和l

我有3个关于编译和链接我的项目的问题,步骤更少

首先,我的项目如下:(我使用Watcom C编译//链接我的项目)

目录“MyProject”包含不同模块和一些文件的3个子目录:

  • 目录“A”(包括A.h和A.c)
  • 目录“B”(包括B.h和B.c)
  • 目录“C”(包括C.h和C.C)
  • 我的.c和我的.h
  • 我的lnk
  • 生成文件
在每个子目录中都有一个对应的makefile

[Q1]假设我更新了目录a中的a.h,并且目录b中的b.c引用了a.h,那么我最初的步骤将是:

  • 在目录A中编译(生成obj和lib…)
  • 在目录B中编译(生成obj和lib…)
  • 返回目录MyProject,然后编译并链接
  • 我可以只走一步就讲完上面的内容吗

    [Q2]如果我想忽略所有现有的obj/lib并全部重建,该如何做

    • 我知道这需要时间,但有时“杀戮和重建”会更好
    [Q3]如果my.h被更新,并且被a.c、b.c和c.c.引用

    我可以只走一步就讲完上面的内容吗

    [我在子目录中的makefile看起来像]

    • 我可以成功地编译cpp文件,一切都很好
    • 在目录B中,我使用相同的方法(批处理文件+生成文件)编译B.cpp
    总结一下我的项目工作以及我提出这个问题的原因是,如果我只是更新一些头文件,那么我想找到“更快的编译/链接序列”

    我尝试将命令
    ehco hello
    添加到规则
    $(DEST)
    中,结果发现该命令没有问题。然后使用echo$(MAKE)并获得:

    ...
    echo C:\WATCOM\BINW\WMAKE.EXE
    C:\WATCOM\BINW\WMAKE.EXE
    ...
    

    谢谢

    我不熟悉你的编译器,所以我看不出这些makefile是如何工作的,所以我们只能一步一步来完成

    1) 当您进入子目录
    a
    时,您使用什么命令来构建目标?它有用吗?在子目录
    B
    中如何

    2) 在主makefile中,是否可以向
    $(DEST)
    规则添加命令,如
    echo hello
    ?如果有效,请尝试
    echo$(MAKE)

    编辑:

    Make的非GNU版本很麻烦,但我们会看看我们能做些什么

    尝试在子文件夹A中编辑生成文件:

    INCLUDE1 = -ic:\watcom\h
    OBJECTS1 = a.obj
    CFLAGS   = -zq -mf -oxsbl $(INCLUDE1)
    DEST     = a1.lib # NOTE THIS CHANGE
    COMPILER = wpp386
    
    .erase # special cmd, tell wmake to "erase" target if make is not successful
    .cpp.obj: .AUTODEPEND
          $(COMPILER) $(CFLAGS) $<
    
    $(DEST) : $(OBJECTS1) makefile
          wlib -q $@ + $(OBJECTS1)
          del $(OBJECTS1)
    

    交叉手指并运行
    make-h
    。这应该重建两个库、编译、链接和解决Q1…

    一个好的makefile应该完全满足您的要求。你的makefile看起来怎么样?对Matthias来说,我在上面列出了我的makefiles。主makefile必须命令子目录中的makefiles。您希望它
    包含
    它们,还是调用它们(
    $(MAKE)A/makefile
    )?到Beta:我在主makefile中添加了
    ($(MAKE)A/makefile)
    ,并在子目录A中更新了A.h(用于测试)。然后在主目录中执行wmake-h,发现:A中的lib文件“未”重新构建。。。我错过了什么吗?我试过了,请检查我上面问题中的[Update 1],谢谢!我在目录A中的makefile中发现了两个差异。第一个是
    A.lib
    ,第二个是为目标添加的
    2个先决条件。我不知道为什么a.exe会更改为a.lib,但我可以理解第二个,因为在更新左侧的目标之前,
    先决条件需要先更新。对于我的Q2,我发现使用
    wmake-a
    可以重建所有目标,对吗?我不知道
    wmake
    ,所以我不知道
    wmake-a
    是否满足Q2。我不知道
    .AUTODEPEND
    ,所以我不知道它是否满足Q3(如果不满足,为什么要满足?)
    wmake-a
    意味着生成所有目标(忽略时间戳)和
    。AUTODEPEND
    意味着使用wmake和openwatcom编译器,使用自动依赖性检查是很简单的。用户需要做的就是使用适当的规则指定.AUTODEPEND指令。C/C++编译器以及Windows和OS/2资源编译器会自动在wmake将从中读取依赖项信息的对象文件中发出依赖项信息。不需要额外的文件或编译器开关。我会检查他们两个。。。!
    @echo off
    del a1.lib
    del *.err
    wmake -h
    wlib -q a1.lib + a.obj
    
    del *.obj
    
    ...
    echo C:\WATCOM\BINW\WMAKE.EXE
    C:\WATCOM\BINW\WMAKE.EXE
    ...
    
    INCLUDE1 = -ic:\watcom\h
    OBJECTS1 = a.obj
    CFLAGS   = -zq -mf -oxsbl $(INCLUDE1)
    DEST     = a1.lib # NOTE THIS CHANGE
    COMPILER = wpp386
    
    .erase # special cmd, tell wmake to "erase" target if make is not successful
    .cpp.obj: .AUTODEPEND
          $(COMPILER) $(CFLAGS) $<
    
    $(DEST) : $(OBJECTS1) makefile
          wlib -q $@ + $(OBJECTS1)
          del $(OBJECTS1)
    
    $(DEST) : $(OBJECTS1) makefile my.lnk
        $(MAKE) -h -C A
        $(MAKE) -h -C B
        $(LINKER) @$(LNK_FILE)