0

次のメイクファイルがあります。

all: a.out b.out
.PHONY: gen_hdr1
gen_hdr1:
    #call script 1 that generates x.h
    rm a.o #try to force rebuild of a.cpp

.PHONY: gen_hdr2
gen_hdr2:
    #call script 2 that generates x.h
    rm a.o #try to force rebuild of a.cpp

b.out: gen_hdr2 a.o
    g++ -o b.out a.o

a.out: gen_hdr1 a.o
    g++ -o a.out a.o
*.o : *.cpp
    g++ -c $< -o $@

a.cpp includex xh

私がしたいこと:

  1. ao が存在する場合は削除する
  2. アプリ A の xh を生成する
  3. a.cpp をコンパイルする
  4. アプリ A をビルドする
  5. ao が存在する場合は削除する
  6. アプリ B の xh を生成する
  7. a.cpp を再度コンパイルする
  8. アプリ B をビルドする

makefile を実行した結果は次のとおりです。

#call script 1 that generates x.h
rm -f a.o #try to force rebuild of a.cpp
g++    -c -o a.o a.cpp
g++ -o a.out a.o
#call script 2 that generates x.h
rm -f a.o #try to force rebuild of a.cpp
g++ -o b.out a.o
g++: a.o: No such file or directory
g++: no input files
make: *** [b.out] Error 1

基本的に、アプリ B のビルド時には ao は見つかりません。make システムに強制的に再構築させるにはどうすればよいですか?

4

1 に答える 1

2

この種の問題の適切な解決策は、ターゲットごとに 1 つ以上のサブフォルダーを使用して、個別のビルド オブジェクト フォルダーを使用することです。

代わりに、次のようなものがあります。

build/first/a.o: src/a.cpp gen/a.h
    # Do you stuff in here
gen/a.h:
    # Generate you .h file if needed

build/second/a.o: src/a.cpp gen/a.h
    # Same thing

このソリューションを使用すると、すべてのビルド オブジェクトがビルド フォルダーに格納されるため、clean コマンドは多少単純になります。

clean:
    rm -rf build/*
    rm -rf gen/*
    rm -rf bin/*

確認する必要がある唯一のことは、ビルド前にディレクトリが存在することですが、それは面倒なことではありません:)

2 つのバージョンの ah を生成する必要がある場合は、同じデザイン (gen/first & gen/second フォルダー) を使用できます。

役に立てば幸いです。何か見逃した場合は教えてください

于 2012-04-18T07:50:51.580 に答える