3

(申し訳ありませんが、次の詳細を含める以外に説明するより良い方法は考えられません)

構築前の構造:

F:\
└ Project\
  └ Project.pro
  └ ProjectSettings.pri
  └ Source\
    └ Source.pro
    └ My_Library\
      └ My_Library.pro
      └ library.cpp
      └ ...

「Project.pro」の内容:

TEMPLATE = subdirs
SUBDIRS = Source

「Source.pro」の内容:

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS +=  My_Library

「My_Library.pro」の内容:

include(../../ProjectSettings.pri)

TEMPLATE = lib
SOURCES += library.cpp

「ProjectSettings.pri」の内容

TARGET = $$basename(_PRO_FILE_PWD_)

Debug:buildDir = "Debug"
Release:buildDir = "Release"

DESTDIR =     $$PWD/$$buildDir/bin
OBJECTS_DIR = $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/obj
MOC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/moc
RCC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/rcc
UI_DIR =      $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/gui

ビルド後の構造:

F:\
└ Project\
  └ Project.pro
  └ ProjectSettings.pri
  └ Source\
    └ Source.pro
    └ My_Library\
      └ My_Library.pro
      └ library.cpp
  └ Debug\
    └ bin\
      └ libMy_Library.a
    └ My_Library\
      └ moc\
      └ obj\
        └ library.o
  └ My_Library\   <------ WTF
    └ moc\
  └ Release\
    └ bin\
      └ libMy_Library.a
    └ My_Library\
      └ moc\
      └ obj\
        └ library.o

問題

アイデアは

  • qmake -recursiveプロジェクトフォルダで実行
  • 指定されたすべてのサブプロジェクトをビルドします
  • よく整理された中間ファイルの束を吐き出します
  • サブプロジェクトのすべてのバイナリを 1 つのフォルダーに配置します。
  • これらはすべて、デバッグまたはリリースのスコープに基づいて分離されています

上で「WTF」 *を強調表示したmocフォルダーを含むプロジェクトフォルダーの「サブプロジェクト」ごとの追加フォルダーを除いて、見事に機能するようです。

質問

  1. .pro ファイル内のどの命令 (の組み合わせ) が "WTF" フォルダを生成しますか?
  2. 「WTF」フォルダは何に使用されますか? (Debug および Release スコープは独自の moc を指定することに注意してください)
  3. 「WTF」フォルダが作成されないようにする方法はありますか?

MOCにmocファイルを出力させるソースファイルはまだないので、現時点ではすべてのmocフォルダーが空です。

* "WTF" = "何のフォルダ"

4

1 に答える 1

3

1.フォルダは、デバッグ スコープとリリース スコープが実行される前に作成されます。 qmakeは 1 つのプライマリ メイク ファイル ( Makefile) を生成し、ビルドするソースがある場合は 2 つの子メイク ファイル (Makefile.DebugおよびMakefile.Release) を生成します。スコープは子に対して設定されますが、親に対しては設定されないため、qmakeは存在しないフォルダーを作成する必要があると判断します。

2.私が知る限り、何にも使用されていません。

3.既に存在する buildDir 定義 (この場合Source) を追加することにより、qmake は余分な中間フォルダーを作成する必要がなくなります。さらに、スコープ テストを変更する必要があります (理由の説明については、こちらこちらを参照してください)。これは次のように要約されますProjectSettings.pri

PROJECT_NAME = $$basename(PWD)
TARGET = $$basename(_PRO_FILE_PWD_)

buildDir = Source
CONFIG( debug, debug|release ) {
    buildDir = "Debug"
} else {
    buildDir = "Release"
}

DESTDIR =     $$PWD/$$buildDir/bin
OBJECTS_DIR = $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/obj
MOC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/moc
RCC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/rcc
UI_DIR =      $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/gui

これが機能する理由はよくわかりませんが、問題は解決しているようです。

于 2011-10-07T09:18:48.057 に答える