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

时间:2012-08-27 08:40:12

标签: 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)
  • my.c和my.h
  • my.lnk
  • 生成文件

在每个子目录中都有一个相应的makefile ...

[Q1] 假设我在目录A中更新了a.h,而目录B中的b.c引用了a.h,那么我的原始步骤将是:

  1. 在目录A中编译(obj和lib生成...)
  2. 在目录B中编译(obj和lib生成...)
  3. 返回目录MyProject然后编译并链接
  4. 我可以采取一步措施来覆盖上述内容吗?

    [Q2] 如果我想忽略所有现有的obj / lib和 重建所有 ,该怎么做?

    • 我知道这需要时间,但有时候“杀死和重建”会更好......

    [Q3] 如果更新my.h并且它被a.c,b.c和c.c引用...

    我可以采取一步措施来覆盖上述内容吗?

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

    INCLUDE1 = -ic:\watcom\h
    OBJECTS1 = a.obj
    CFLAGS   = -zq -mf -oxsbl $(INCLUDE1)
    DEST     = a.exe
    COMPILER = wpp386
    
    .erase # special cmd, tell wmake to "erase" target if make is not successful
    .cpp.obj: .AUTODEPEND
          $(COMPILER) $(CFLAGS) $<
    
    $(DEST) : $(OBJECTS1) makefile
    

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

    INCLUDE1 = -i=c:\myproj\my -i=c:\watcom\h 
    OBJECTS1 = my.obj
    CFLAGS   = -zq -fp6 -mf -6r -s -oxsbl $(INCLUDE1)
    DEST     = my.exe
    COMPILER = wpp386
    LINKER   = wlink
    LNK_FILE = my.lnk
    
    .erase # special cmd, tell wmake to "erase" target if make is not successful
    
    .cpp.obj: .AUTODEPEND
          $(COMPILER) $(CFLAGS) $<
    
    
    $(DEST) : $(OBJECTS1) makefile my.lnk
          $(LINKER) @$(LNK_FILE)
    

    [更新1]

    我使用wpp386作为编译器,它是watcom c ++工具。

    要构建目标,我使用一个批处理文件来编译cpp文件:

    @echo off
    del a1.lib
    del *.err
    wmake -h
    wlib -q a1.lib + a.obj
    
    del *.obj
    
    • 我可以成功编译cpp文件,一切都很好。
    • 在目录B中,我使用相同的方式(批处理文件+ makefile)来编译b.cpp

    总结一下我的项目工作情况和我要求找到“更快的编译/链接序列”的原因,如果我只更新一些头文件......

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

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

    谢谢!

1 个答案:

答案 0 :(得分:1)

我不熟悉你的编译器,所以我看不出这些makefile是如何工作的,所以我们必须一步一步。

1)当你进入子目录A时,你用什么命令来构建目标?它有用吗?在子目录B中怎么样?

2)在主makefile中,您可以向echo hello规则添加命令,例如$(DEST)吗?如果可行,请尝试echo $(MAKE)

修改

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

尝试在子目录A:

中编辑makefile
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,而不是批处理文件。这应该重建库(如果库需要重建)。如果有效,请尝试向上移动MyProject并运行make -h -C A。这应该在A中执行makefile并在那里重建库(除非WMAKE有其他语法)。

如果 ,请尝试在B中进行相同的更改,然后编辑主makefile中的$(DEST)规则:

$(DEST) : $(OBJECTS1) makefile my.lnk
    $(MAKE) -h -C A
    $(MAKE) -h -C B
    $(LINKER) @$(LNK_FILE)

用手指交叉make -h。这应该重建两个库,编译,链接和解决 Q1 ...