3

本質的に、cmake のターゲットの一部ではないヘッダー ファイルをモックできるようにしたいのですが、それらのヘッダーのファイル名がわからないという追加の困難があります。

実際のプロジェクトは非常に複雑で、自動ビルド システムの一部です。以下は簡単な例です。次のような構造のプロジェクトを考えてみましょう。

CMakeLists.txt
src/lib/ source.cpp src
/lib/CMakeLists.txt
src/include/some_header.hpp # source.cpp に含まれる


メインの CMakeLists.txt の内容:

cmake_mimimum_required(VERSION 2.8.6)
project("automoctest")
add_subdirectory(src/lib)



src/lib/CMakeLists.txt の内容:

include_directories(${CMAKE_HOME_DIRECTORY}/src/include)
find_package(Qt4 4.8 REQUIRED QtCore)
include(UseQt4)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_library(foo SHARED source.cpp)
target_link_libraries(foo ${QT_LIBRARIES})
set_target_properties(foo PROPERTIES AUTOMOC true)



source.cpp 内には、ファイル some_header.hpp が次のように含まれています。

#include "some_header.hpp"



問題:
ファイル some_header.hpp には Q_OBJECT が含まれており、いくつかのシグナルが含まれているため、moc はその魔法を働かせる必要があります。ただし、ヘッダーは実際のプロジェクト内にないため、ヘッダーはモックされません。some_header.hpp のファイル名さえ知らないので、具体的にモックするために追加することはできません。明らかに、AUTOMOC は、ソース ファイルにそれらのいずれかが含まれている場合でも、モック可能なファイルの include_directories をチェックしません。

私が試したこと(失敗):


  • cmake のドキュメントで説明されているように、source.cpp で #include moc_some_header.cpp を使用します。これにより、cmake が some_header{.h,.hpp,.hxx,.H} を見つけられなかったというエラーが発生します。
  • CMAKE_AUTOMOC_RELAXED_MODE を true に設定します。これが実際に何をするのかはドキュメントからは明らかではありませんが。とにかく違いはありませんでした。
  • AUTOMOC_MOC_OPTIONS を -Isrc/include または -I/path/to/project/src/include または -I${CMAKE_HOME_DIRECTORY}/src/include に設定
    しても、何も表示されません。

AUTOMOC の素晴らしい点は、実際にどのファイルをモックする必要があるかを知る必要がないことです。ただし、この場合、ソース ファイルに含まれる、内部に Q_OBJECT が含まれている可能性のあるすべてのヘッダーを知る必要があります。

モック可能なファイルを探す場所をAUTOMOCに正確に伝える方法はありますか?

4

1 に答える 1

1

本当に、または に設定AUTOMOC_MOC_OPTIONSしましたか? 前者はおそらく存在しません。-Isrc/include-I/path/to/myproject/src/include


私は常に MOC マクロを使用してきました。AUTOMOCCMakeに組み込まれている新しいもののようです。

私は通常、ライブラリまたは実行可能ファイルを作成するときにすべてのヘッダーを含めます-つまり

add_library(foo SHARED source.cpp ../include/some_header.hpp )

これで動作するようになる思いAUTOMOCます。期待どおりに動作させるという追加の利点がありmakeます-ヘッダーが変更されたときにライブラリを再構築します。

事前にファイルをコマンドに追加できない場合は、cmake 関数を記述して 内のステートメントを検索し、それらのファイルを見つけてadd_libraryを検索する必要があると思います。それらが一致する場合、それらを変数に追加します - おそらく. 次に、行は次のようになります#includesource.cppQ_OBJECTEXTRA_MOCSadd_library

add_library(foo SHARED source.cpp ${EXTRA_MOCS} )
于 2012-10-20T23:54:56.120 に答える