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?
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:
${...}
$ENV{....}
accède aux variables d'environnement.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
FindEigen3
évalue cette variable pour déterminer l'emplacement de votre installation Eigen3.<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. 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.)
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.
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/
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})