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
で指せるようにしている。
参考レポジトリ
下記のレポジトリの2019年3月15日現在の最新版では、上のような方法で両者のケースに対応している。