1. ホーム
  2. c++

[解決済み] あるmakefileを他のmakefileにインクルードするには?

2022-03-07 21:09:23

質問

C++のクラスがいくつかあり、それぞれ自分のフォルダにmakefile、テスト用のtest.cppなどが入っています。

Main folder
 |-> Class1 folder
 |-> Class2 folder
      |-> Class2.1 folder
 |-> Class2 folder

私はメインプロジェクトを持っており、それにはこれらのクラスが含まれている必要があります。私は、すべてのサブメイクファイルをメインメイクファイルに含めようとしています。

INCLUDE POO/makefile"で試しましたが、2つの問題があります。

  • サブメイクファイルのパスが正しくないため、ファイルが見つかりません ("There is not rule to build the target 'Vector3D.cpp'").
  • おそらくパスの問題で、"test.cpp"ファイルがオーバーライドされています("warning: overriding recipe for target ...")。

私はすべてのmakefileを独立させたいので、クラスフォルダを新しいプロジェクトにコピー/ペーストしても動作しますし、makefileに変更を加えずに単独で実行することもできます。

そこで質問ですが、あるmakefileを別のmakefileに(正しく)インクルードするにはどうしたらよいでしょうか?

テスト用の例です。

メインメイクファイル(簡易版)

include Vector3D/makefile
include Color/makefile

CPP      = g++
CXXFLAGS = $(CXXINCS) -Wall -O0

all: main

main: main.o Vector3D.o Color.o
    $(CPP) main.o Vector3D.o Color.o -o main

main.o: main.cpp
    $(CPP) -c main.cpp -o main.o $(CXXFLAGS)

サブメイクファイルの例(簡略化)

#Vector3D
CPP      = g++
CXXFLAGS = $(CXXINCS) -Wall -O0


all: test

test: Vector3D.o test.o
    $(CPP) Vector3D.o test.o -o test

Vector3D/test.o: test.cpp
    $(CPP) -c test.cpp -o test.o $(CXXFLAGS)

Vector3D.o: Vector3D.cpp Vector3D.hpp
    $(CPP) -c Vector3D.cpp -o Vector3D.o $(CXXFLAGS)

Vector3DよりColor/makefileの方が似ています。

解決方法は?

<ブロッククオート

クラスフォルダを新しいプロジェクトにコピー&ペーストしても動作するように、すべてのmakefileを独立させたいのですが、makefileを変更せずに単独で実行することはできますか?

それは無理な話だと思いますよ。 makefileはスタンドアローンである必要があり、その場合、トップレベルのファイルを起動するようにすることができます。 make を再帰的に下位ディレクトリに配置する(そのため include それらを) または を使えば、他のmakefileをインクルードして形成された単一の非再帰的なmakefileを持つことができます。両方は無理だと思います。

あるmakefileを他のmakefileに(正しく)インクルードするには?

唯一の有効な答えは、" を使うことです。 include ディレクティブは、(通常の "it depends" 以外に) 他のアドバイスは、makefile の構造によって異なります。メイクファイル 設計 の方が、当然ながらインクルードしやすいでしょう。ただ適当にmakefileをインクルードして、それが動くことを期待しても......うまくいかないでしょう。チェックアウト 非再帰的なmakeの実装 Boilermake は、非再帰的な makefile を動作させる方法についてです。

デフォルトのターゲットがインクルードされたファイルの最初のものになるため、ファイルの先頭にそれらを含める必要はなく、そうすることは悪い考えかもしれないことに注意してください。