CMakeのfind_package(Choreonoid)のためのファイル

以前のバージョンでは,インストール時に生成されるshare/choreonoid/cmake/choreonoid-config.cmakeCHOREONOID_INCLUDE_DIRSにQtのディレクトリ群も含まれていました.しかし,最新のバージョンでは,インストール時に生成されるshare/choreonoid/cmake/ChoreonoidConfig.cmake‘のCHOREONOID_INCLUDE_DIRSにQtのディレクトリ群は含まれていません.

このためちょっと困ったのですが,どのように対応するのが正解でしょうか?
当座の策として,強引にinclude_directories()にQtのディレクトリ群の生のパス名を設定しました.

確かにCHOREONOID_INCLUDE_DIRSにQtのディレクトリは含まれていません。これについては、結論から言うと、一応設計上はそれで問題ないということになります。以下その理由を説明します。ただし設計上はそうであっても、実際にはうまくいってないということもあり得ますので、その場合はお知らせください。

通常はQt関連のインクルードやリンクが必要なのはプラグインかと思います。プラグインのベースとなるChoreonoidのモジュール(ライブラリ)としてChoreonoidのBaseモジュールがあり、プラグインをビルドする際にはBaseモジュールをリンクするようにします。find_package(Choreonoid)とすると、内部でChoreonoidConfig.cmakeが実行されて、いろいろな変数が設定されますが、その中にCHOREONOID_BASE_LIBRARIESという変数があります。これはBaseモジュールをリンクするのに必要な全てのライブラリが含まれていて、その中にはQtのライブラリがあります。ですのでまずリンクについてはtarget_link_librariesに${CHOREONOID_BASE_LIBRARIES}を指定すればQtのライブラリもリンクされることになります。

ではQt用のインクルードディレクトリやライブラリディレクトリはどうやって指定するのか?ということになるかと思うのですが、実は(設計上は)target_link_librariesに${CHOREONOID_BASE_LIBRARIES}を指定すれば、それだけで必要なインクルードパスやライブラリパスが自動で設定されるようになっています。ですので、CHOREONOID_INCLUDE_DIRSにQtのインクルードパスが含まれていなくても大丈夫です。

ではなぜそのようなことが可能になるかと言うと、これはCMakeの比較的新しい機能である「Imported Targets」によって実現されているようです。これは元々QtをCMake経由で使うためのCMakeのファイルをQtが提供しているのですが、それがその機能を使うようになっています。詳しくは以下のマニュアルをご参照ください。
https://doc.qt.io/qt-5/cmake-manual.html

具体的にどうなっているかと言うと、CHOREONOID_BASE_LIBRARIESに含まれるQtのライブラリは、Qt5::CoreとかQt5::Widgetsなどと言った書き方になっていて、通常のライブラリファイルの書き方とは異なります。これがCMakeのImported targetsの書き方になります。そしてこの場合、例えばQt::Coreを指定すると、その中にインクルードパスやライブラリパスの情報が含まれていて、それで上記のようにそれらのパスが自動で設定されるようなのです。

というわけで設計上は特にインクルードパスを設定する必要はないはずなのですが、Windowsではあまり検証できていなかったので、まだどこかに不具合がある可能性があります。上記の仕組みについて把握された上で、それでもうまくいかないようでしたら、お知らせいただければと思います。

1 Like

詳しく説明していただきありがとうございます.
include_directories()にQtのディレクトリ群を追加することなく,
target_link_libraries()${CHOREONOID_BASE_LIBRARIES}を追加することで解決しました.

うまくいったとのことで、よかったです。ご報告ありがとうございます。