0

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

首先,我的项目看起来像:(我使用 Watcom C 编译//链接我的项目)

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

  • 目录“A”(包括 ah 和 ac)
  • 目录“B”(包括 bh 和 bc)
  • 目录“C”(包括 ch 和 cc)
  • my.c 和 my.h
  • 我的.lnk
  • 生成文件

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

[Q1]假设我在目录 A 中更新 ah 并且 ah 被目录 B 中的 bc 引用,那么我的原始步骤将是:

  1. 在目录 A 中编译(生成 obj 和 lib...)
  2. 在目录 B 中编译( obj 和 lib 生成...)
  3. 返回目录 MyProject 然后编译并链接

我可以迈出一步来覆盖上面吗?

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

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

[Q3]如果 my.h 被更新并且它被 ac、bc 和 cc 引用。

我可以迈出一步来覆盖上面吗?

[我在子目录中的 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
...

谢谢 !

4

1 回答 1

1

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

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

2)在主makefile中,你可以添加一个命令,比如echo hello规则$(DEST)吗?如果可行,请尝试echo $(MAKE).

编辑:

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

尝试在 subdir 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. 这应该在其中执行 makefileA并在那里重建库(除非WMAKE有其他语法)。

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

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

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

于 2012-08-28T03:42:09.103 回答