关于在 更少 步骤中编译和关联我的项目,我有3个问题...
首先,我的项目如下:(我使用Watcom C编译//链接我的项目)
目录'MyProject'包含3个不同模块和一些文件的子目录:
在每个子目录中都有一个相应的makefile ...
[Q1] 假设我在目录A中更新了a.h,而目录B中的b.c引用了a.h,那么我的原始步骤将是:
我可以采取一步措施来覆盖上述内容吗?
[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
总结一下我的项目工作情况和我要求找到“更快的编译/链接序列”的原因,如果我只更新一些头文件......
我尝试将命令ehco hello
添加到规则$(DEST)
,发现它没问题。然后使用echo $(MAKE)
并获得:
...
echo C:\WATCOM\BINW\WMAKE.EXE
C:\WATCOM\BINW\WMAKE.EXE
...
谢谢!
答案 0 :(得分:1)
我不熟悉你的编译器,所以我看不出这些makefile是如何工作的,所以我们必须一步一步。
1)当你进入子目录A
时,你用什么命令来构建目标?它有用吗?在子目录B
中怎么样?
2)在主makefile中,您可以向echo hello
规则添加命令,例如$(DEST)
吗?如果可行,请尝试echo $(MAKE)
。
修改
Make的非GNU版本很麻烦,但我们会看到我们能做什么。
尝试在子目录A:
中编辑makefileINCLUDE1 = -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 ...