0

プロジェクトを少ない手順でコンパイルおよびリンクする方法について 3 つの質問があります...

まず、私のプロジェクトは次のようになります: (私は Watcom C を使用してプロジェクトをコンパイル//リンクします)

ディレクトリ「MyProject」には、さまざまなモジュールといくつかのファイル用の 3 つのサブディレクトリが含まれています。

  • ディレクトリ 'A' (ah と ac を含む)
  • ディレクトリ 'B' ( bh と bc を含む)
  • ディレクトリ 'C' (ch と cc を含む)
  • my.c と my.h
  • my.lnk
  • メイクファイル

そして、各サブディレクトリ内には、対応する 1 つの makefile があります...

[Q1]ディレクトリ A の ah を更新し、ディレクトリ B の bc によって ah が参照されていると仮定すると、元の手順は次のようになります。

  1. ディレクトリ A でコンパイルします ( obj と lib が生成されます...)
  2. ディレクトリ B でコンパイルします ( obj と lib が生成されます...)
  3. ディレクトリ MyProject に戻り、コンパイルしてリンクします

上記をカバーするために一歩踏み出すことはできますか?

[Q2]既存の obj/lib をすべて無視して、すべて再構築したいのですが、どうすればいいですか?

  • これには時間がかかることはわかっていますが、「強制終了して再構築」する方が良い場合もあります...

[Q3] my.h を更新して、ac,bc,cc で参照されている場合..

上記をカバーするために一歩踏み出すことはできますか?

[サブディレクトリ内の私のメイクファイルは次のようになります]

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

[メインディレクトリにある私のメイクファイルは次のようになります]

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++ ツールです。

ターゲットをビルドするには、1 つのバッチ ファイルを使用して cpp ファイルをコンパイルします。

@echo off
del a1.lib
del *.err
wmake -h
wlib -q a1.lib + a.obj

del *.obj
  • cpp ファイルを正常にコンパイルでき、すべて問題ありません。
  • ディレクトリBで、同じ方法(バッチファイル+メイクファイル)を使用してb.cppをコンパイルします

私のプロジェクトの作業と私が尋ねる理由を要約すると、ヘッダーファイルを更新するだけで「より高速なコンパイル/リンクシーケンス」を見つけることができます...

コマンドehco helloをルールに追加しようとした$(DEST)ところ、問題ないことがわかりました。次に、使用echo $(MAKE)して取得しました:

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

ありがとう !

4

1 に答える 1

1

私はあなたのコンパイラに詳しくないので、これらのメイクファイルがどのように機能するかわかりません。そのため、一度に 1 つずつステップを踏む必要があります。

1) サブディレクトリに移動するときA、ターゲットをビルドするためにどのコマンドを使用しますか? それは機能しますか?サブディレクトリではどうBですか?

echo hello2) メインのメイクファイルに、$(DEST)ルールなどのコマンドを追加できますか? それが機能する場合は、試してくださいecho $(MAKE)

編集:

非 GNU バージョンの Make は面倒ですが、何ができるか見てみましょう。

サブディレクトリ 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。これにより、makefileが実行され、Aそこでライブラリが再構築されます(WMAKE他の構文がない限り)。

それが機能する場合は、 で同じ変更を行ってから、メインのメイクファイルでルールを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 に答える