3

CMakeLists.txt次のように、いくつかの一般的なものを定義し、プロジェクト内のすべての成果物 (サブプロジェクト) の構成を呼び出すトップ レベルを持つ中規模のプロジェクトがあります。

add_subdirectory(components/A)
add_subdirectory(components/B)
add_subdirectory(components/C)

add_subdirectory(components/E)

アーティファクトは、静的/共有ライブラリまたは実行可能ファイルです (何らかの形で相互に依存しています)。この例では、実行可能ファイルは 1 つだけです: E. qt4_wrap_cppMOC の処理にプレーン オールドを使用すると、すべてが完全に正常に構成およびビルドされます。

以下を先頭に追加して、(比較的) 新しいAUTOMOC機能に切り替える場合CMakeLists.txt:

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

静的/共有ライブラリのすべてのソースはAUTOMOC問題なく編集されます。ただし、実行可能なターゲット (Eこの例では) のソースは決してAUTOMOC編集されません。

私は両方MSYS MakefilesNinjaジェネレーターを試しましたが、どちらも単にAUTOMOC「ing」のターゲットを作成せず、実行可能ファイルのソースに対してのみ作成します(静的/共有ライブラリターゲットAUTOMOCの場合、「ing target」が追加されます)。

  • すでにそれを経験した人はいますか?
  • 原因は何ですか?
  • 虫の匂いですか?

アップデート


原因がわかりました。議論はCMake メーリング リストにあります。

4

1 に答える 1

3

要約すると、問題Eは Qt モジュールも明示的にも含まれていないことでした:

find_package(Qt4 ...)

暗黙的にも:

find_package(MyPrecious ...)

MyPreciousQtを単独で含むサードパーティのモジュールがどこにある可能性があります。

その結果、キャッシュされていない変数などQT_VERSION_*はサブプロジェクトのスコープに存在せずE、そのためAUTOMOC機能が正しく機能しません。私が言う厄介な落とし穴。詳細については、CMake メーリング リストを参照してください。

于 2013-04-30T12:31:22.487 に答える