CMakeで管理するプロジェクトでEigen 3.Xを使うときのTips

Eigen 3.3以降

Eigen 3.3以降は

find_package(Eigen3 REQUIRED)

として、

target_link_libraries(mylibrary Eigen3::Eigen)

とすれば良い。

Eigen 3.3以降に関する公式ドキュメント: eigen.tuxfamily.org

なおmacOSのHomebrewで

brew install eigen

とすると、2019年3月15日現在、Eigen 3.3.7が入るので、この方法で良い。

Eigen 3.2以前

Eigen 3.2以前やEigen 3.3-betaなどは

find_package(Eigen3 REQUIRED)

としても、EIGEN3_INCLUDE_DIRなどの変数はセットされるが、上述のようなEigen3::Eigenというtargetは生成されない。そこで、

target_include_directories(mylibrary PUBLIC ${EIGEN3_INCLUDE_DIR})

などとしてヘッダーへのパスを通す必要がある。

なお、この方法だとmylibraryとEigenとの依存関係が直接的には指定できていないので、その後階層的に依存関係を構築したりする際にもしかするとどこかで弊害があるかもしれない(要確認)し、見た目にも依存関係が分かりにくい(主観)。

なおUbuntuのaptで

sudo apt install libeigen3-dev

とすると、Eigen 3.2やEigen 3.3-betaがインストールされる環境が存在するので、その場合はこのような方法をとる必要がある。

両方のケースに対応するCMake

両者に対応し、依存関係も直接指定するには、

find_package(Eigen3 REQUIRED)
if((NOT TARGET Eigen3::Eigen) AND (DEFINED EIGEN3_INCLUDE_DIR))
    add_library(AliasEigen3 INTERFACE)
    target_include_directories(AliasEigen3 INTERFACE ${EIGEN3_INCLUDE_DIR})
    add_library(Eigen3::Eigen ALIAS AliasEigen3)
endif()

とした上で

target_link_libraries(mylibrary Eigen3::Eigen)

とすれば良い。

Eigenはheader-only libraryなので、INTERFACEキーワードでtargetを設定した上で、ALIASキーワードを使ってEigen3::Eigenで指せるようにしている。

cmake.org

参考レポジトリ

下記のレポジトリの2019年3月15日現在の最新版では、上のような方法で両者のケースに対応している。

github.com github.com