web-dev-qa-db-fra.com

Trouver le paquet Eigen3 pour CMake

CMake ne trouve pas mon Eigen3 package. Je mets une variable d'environnement appelée

EIGEN3_INCLUDE_DIR

pointant vers le chemin où FindEigen3.cmake est.

Ensuite, dans le CMakelists.txt, j'ai écrit:

find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )

Je reçois le prochain message d'erreur:

CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:91 (MESSAGE):
  Could NOT find Eigen3 (missing: EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
  (Required is at least version "2.91.0")
Call Stack (most recent call first):
  C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:252 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindEigen3.cmake:76 (find_package_handle_standard_args)
  test/test_quaternion/CMakeLists.txt:25 (find_package)

Une idée de ce qui me manque ou de ce que je fais mal?

16
Jav_Rock

Comme Eigen3 est complètement en-tête seulement, tout ce dont vous avez besoin est le chemin du répertoire include. Et celui-ci, vous définissez déjà manuellement de toute façon. Il n’ya donc pas vraiment besoin d’un appel FindEigen3.cmake ou FIND_PACKAGE

Simplement utiliser

INCLUDE_DIRECTORIES ( "$ENV{EIGEN3_INCLUDE_DIR}" )

ou

SET( EIGEN3_INCLUDE_DIR "$ENV{EIGEN3_INCLUDE_DIR}" )
IF( NOT EIGEN3_INCLUDE_DIR )
    MESSAGE( FATAL_ERROR "Please point the environment variable EIGEN3_INCLUDE_DIR to the include directory of your Eigen3 installation.")
ENDIF()
INCLUDE_DIRECTORIES ( "${EIGEN3_INCLUDE_DIR}" )

Quelques notes:

  1. Si vous voulez accéder au contenu d'une variable CMake, assurez-vous d'utiliser ${...}
  2. $ENV{....} accède aux variables d'environnement.
  3. Le deuxième exemple s'arrête avec une erreur si la variable d'environnement n'est pas définie (et donc, la variable EIGEN3_INCLUDE_DIR est vide)
  4. Veillez à utiliser des guillemets autour des variables (évaluées) si elles peuvent contenir des espaces. Sinon, CMake l'interprétera comme une liste.
  5. Si vous souhaitez utiliser des modules de recherche personnalisés, assurez-vous de les placer dans votre installation CMake ou, comme @Fraser l'a souligné ci-dessus, de pointer CMAKE_MODULE_PATH sur le répertoire où il se trouve. Pas sûr, mais il se pourrait que CMake vérifie également le répertoire actuel automatiquement (où réside votre CMakeLists.txt. De toute façon, définir EIGEN3_INCLUDE_DIR n'a aucun lien avec l'emplacement de FindEigen3.cmake
  6. Cependant, il est possible que votre script FindEigen3évalue cette variable pour déterminer l'emplacement de votre installation Eigen3.
  7. Alternativement, les projets basés sur CMake construits par eux-mêmes fournissent souvent un <PackageName>Config.cmake. Si vous pointez une variable appelée <PackageName>_DIR vers le répertoire contenant ce fichier, vous pouvez utiliser FIND_PACKAGE( <PackageName> ...) normalement. Voir la documentation de FIND_PACKAGE pour plus de détails. 
23
Johannes S.

Tout d’abord, assurez-vous que Eigen est correctement installé. Reportez-vous au fichier INSTALL fourni avec l'archive.

Deuxièmement, copiez le fichier cmake/FindEigen3.cmake de l'archive dans le répertoire contenant votre CMakeLists.txt.

Dans votre CMakeLists.txt, ajoutez:

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})

Maintenant, vous devriez être capable de faire par exemple #include <Eigen/Core>.

Tout cela vient (principalement) de cette source .

Cette approche a l’avantage sur, par exemple, include_directories("$ENV{EIGEN3_INCLUDE_DIR}") qu'il utilise le mécanisme standard de CMake pour rechercher des dépendances externes, ce qui permet à une autre personne (ou votre future personne) de récupérer le projet plus facilement, éventuellement sur une autre plateforme.

(Cependant, ce serait bien si Eigen avait lui-même installé un fichier EigenConfig.cmake, le rendant accessible via le mécanisme find_package sans chemin supplémentaire.)

7
Emil

J'ai trouvé une autre solution ici (qui faisait référence à ici ) qui utilise le fichier pkg-config:

find_package(PkgConfig)
pkg_search_module(Eigen3 REQUIRED eigen3)
4
agold

Eigen> = 3.3 a une intégration directe avec CMake, il semble donc que le vôtre ne soit pas configuré correctement.

Supposons que Eigen a été installé sur /opt/eigen/3.3 avec les paramètres par défaut. Ajoutez ou préfixez l'emplacement /opt/eigen/3.3/share/eigen3/cmake à la variable d'environnement CMAKE_PREFIX_PATH, par exemple, en bash:

export CMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH:/opt/eigen/3.3/share/eigen3/cmake"

Ensuite, CMake devrait le prendre.


Si vous écrivez votre propre CMakeLists.txt qui utilise Eigen, je suggère d'utiliser un code comme celui-ci:

find_package (Eigen3 3.3 REQUIRED)
add_executable (example example.cpp)
target_link_libraries (example Eigen3::Eigen)

Vous ne devriez pas utiliser include_directories depuis la sortie de CMake 3 - vous devriez privilégier l’approche par cibles chaque fois que cela est possible.

3
Levi Morrison

Vous pouvez essayer de définir le CMAKE_MODULE_PATH à l'emplacement du sous-répertoire Eigen nommé "cmake":

cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/
1
Fraser

Si vous n'avez pas ajouté Eigen Library à la variable d'environnement, procédez comme suit dans CMakeLists.txt:

cmake_minimum_required(VERSION 3.9)
project(ProjectName)

set(CMAKE_CXX_STANDARD 11)

# set EIGEN_DIR variable to Eigen Library Path
set(EIGEN_DIR "C:\\Eigendir\\Eigen")

# include the directory
include_directories(${EIGEN_DIR})

add_executable(ProjectName main.cpp)

target_link_libraries(ProjectName ${EIGEN_DIR})
1
Jai