2012-09-03 26 views
12

CMake no puede encontrar mi paquete Eigen3. Me establecer una variable de entorno llamadaBuscar paquete Eigen3 para CMake

EIGEN3_INCLUDE_DIR 

apuntando a la ruta donde FindEigen3.cmake es.

Luego, en el CMakeLists.txt me escribió:

find_package(Eigen3 REQUIRED) 
include_directories(EIGEN3_INCLUDE_DIR) 

consigo siguiente mensaje de error:

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) 

Cualquier idea sobre lo que me falta o hacer mal?

Respuesta

18

Desde Eigen3 está completamente Sólo encabezado, todo lo que necesitas es la ruta de acceso al directorio de inclusión. Y este, ya estás definiendo manualmente de todos modos. Por lo tanto, no es necesario llamar a FindEigen3.cmake o FIND_PACKAGE.

simplemente usar

INCLUDE_DIRECTORIES ("$ENV{EIGEN3_INCLUDE_DIR}") 

o

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}") 

Unas pocas notas:

  1. Si desea acceder a la contenido de una variable CMake, asegúrese de usar ${...}
  2. $ENV{....} accede a variables de entorno.
  3. El segundo ejemplo se detendrá con un error si la variable de entorno no se establece (y, por lo tanto, la variable cmake EIGEN3_INCLUDE_DIR está vacía)
  4. tener cuidado de usar comillas alrededor de las variables evaluadas() si podían contener espacios en blanco. De lo contrario, CMake lo interpretará como una lista.
  5. Si desea utilizar módulos de búsqueda personalizados, asegúrese de colocarlos en su instalación de CMake o, como @Fraser se indicó anteriormente, asegúrese de señalar CMAKE_MODULE_PATH al directorio donde se encuentra. No estoy seguro, pero podría ser que CMake comprueba el directorio actual, así automáticamente (donde sus CMakeLists.txt reside. En cualquier caso, el establecimiento de EIGEN3_INCLUDE_DIR tiene ninguna relación con la ubicación de FindEigen3.cmake
  6. Sin embargo, podría ser que la secuencia de comandos FindEigen3 evalúa este variable para determinar la ubicación de la instalación de Eigen3.
  7. Por otra parte, los proyectos basados ​​en CMake auto-construidas a menudo proporcionan un <PackageName>Config.cmake. Si apunta una variable llamada <PackageName>_DIR al directorio que contiene este archivo, puede utilizar FIND_PACKAGE(<PackageName> ...) como normales. Ver documentation of FIND_PACKAGE para más detalles.
+3

Sí, esta es la respuesta que estaba buscando. La clave es ** ** ENV **, gracias hombre. Aprendí mucho con esta publicación. –

+0

Paréntesis de cierre faltante después de ** MENSAJE (FATAL_ERROR "Señale la variable de entorno EIGEN3_INCLUDE_DIR al directorio de inclusión de su instalación Eigen3." ** – 3yanlis1bos

+0

¿Qué es el directorio de inclusión de Eigen3? –

1

Usted podría intentar establecer el CMAKE_MODULE_PATH a la ubicación de Eigen subdirectorio llamado "cmake":

cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/ 
+0

¿Y cómo puedo escribir esto en los cmakelists, en lugar de como una línea de comando? –

+0

use el comando 'SET (...)' para establecer variables localmente. –

6

Primero, asegúrese de que Eigen esté instalado correctamente. Consulte el archivo INSTALL que viene con el tarball.

Segundo, copie el archivo cmake/FindEigen3.cmake del tarball al directorio que contiene su CMakeLists.txt.

En su CMakeLists.txt complemento:

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

Ahora usted debería ser capaz de hacer, por ejemplo, #include <Eigen/Core>.

Todo esto proviene (principalmente) de este source.

Este enfoque tiene la ventaja sobre, por ejemplo, include_directories("$ENV{EIGEN3_INCLUDE_DIR}") que utiliza el mecanismo estándar de CMake para encontrar dependencias externas, facilitando que otra persona (o su futuro yo) pueda retomar el proyecto, posiblemente en otra plataforma.

(Sin embargo, sería bueno si misma Eigen instala un archivo EigenConfig.cmake, por lo que es accesible a través del mecanismo de find_package sin ningún tipo de caminos adicionales.)

+1

No, Eigen debe instalar los archivos del paquete cmake config. //www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#creating-packages – steveire

+0

Probablemente debería, pero no es un remedio completo. Si Eigen no se instaló, el error los mensajes serían más crípticos, la mayoría girando en torno a CMake no pudiendo encontrar el archivo FindEigen3.cmake en sí ... lo que podría indicarle que incluya el archivo en su paquete de todos modos. Editado por publicación – Emil

+0

Está confundiendo conceptos. para el documento al que me he vinculado (y lo escribí), Eigen instalaría EigenConfig.cmake, no FindEigen.cmake. – steveire

4

he encontrado otra solución here (que hace referencia a here), que utiliza el archivo pkg-config:

find_package(PkgConfig) 
pkg_search_module(Eigen3 REQUIRED eigen3) 
Cuestiones relacionadas