3

これは Qt や moc というよりも GNU Make に関する質問だと思いますが、ここに行きます。

複数の を含むディレクトリがありQ_OBJECTS、これらすべてを収集する単純なコードがあります。

MOCS := $(shell grep -l Q_OBJECT $(HEADERS))

HEADERS「現在の場所」にあるヘッダーファイルのコレクションであると仮定します

ここでやりたいことは、Qt moc を呼び出して .C ファイルをビルドし、それをオブジェクトにコンパイルするルールを指定することです。そのようなルールをどのように指定しますか?

私の出発点は愚かです:

MOC_SOURCES := $(MOCS:%.h=%.C)
MOC_OBJECTS := $(MOC_SOURCES:%.C=%.o)

$(MOC_SOURCES) : $(MOCS)
  @echo "Building Moc: $@ from $<"
  $(MOC) $< -o $@

何が起こっているのかというと$<、最初のヘッダーであり、関連するヘッダーではなくこのヘッダーを使用してすべてのオブジェクトがコンパイルされるため、これはばかげています。

正しい moc オブジェクトが正しいヘッダーから構築されるように、これをクリーンアップする方法はありますか?

4

2 に答える 2

4

$(MOCS_SOURCES)各コンポーネントから各コンポーネントを生成するには、次のように静的パターン ルール$(MOC)を使用できます。

$(MOC_SOURCES) : %.C: %.h
    @echo "Building Moc: $@ from $<"
    $(MOC) $< -o $@

もう 1 つの一般的な方法は、暗黙的な規則を使用することですが、moc. qmakeがオプションではない場合に私が使用するものは次のとおりです。

%.moc.o: %.moc.cpp
    $(CXXCOMPILE) $(QT_CPPFLAGS) $(QT_CXXFLAGS) -c $< -o $@

%.moc.cpp: %.h
    $(MOC) $< -o $@
于 2013-06-26T20:38:09.720 に答える
1

QT や moc については何も知りませんが、moc が単一のヘッダー ファイルを取得して単一のファイルを生成するツールであるということであれば.C、次のパターン ルールを使用できます。

%.C : %.h
        $(MOC) $< -o $@
于 2013-06-26T16:34:25.067 に答える