2015-12-07 14 views
6

Ich bin ein bisschen verzweifelt finden: Für mein Studium brauche ich für die Arbeit mit Eigen und CMake. Ich bin in der Lage Eigen zu verwenden, wenn ich die ganze Bibliothek in die Verzeichnisse kopieren, in dem mein Compiler standardmäßig aussieht, aber sobald ich versuche, es zu finden, über
find_package(Eigen3 REQUIRED)
ich die folgende Fehlermeldung erhalten: kann nicht Eigen3 mit CMake


CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:148 (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): 
    /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE) 
    FindEigen3.cmake:76 (find_package_handle_standard_args) 
    CMakeLists.txt:8 (find_package)

-- Configuring incomplete, errors occurred!


nun suchte ich nach Lösungen, aber alles, was ich die, die ich versuchte (auch diejenigen, auf Stackoverflow:
Find package Eigen3 for CMake oder CMake Can't find Eigen3) haben nicht funktioniert. Mein Eigen Version (nach den Makros in Core/util/Macros.h) ist 3.2.5. ich das Verzeichnis Eigen halten in /usr/local/include, verwende ich die FindEigen3.cmake, die mit der Eigen-Bibliothek kommt und meine CMakeLists.txt sieht wie folgt aus:


cmake_minimum_required(VERSION 2.8) 
project(Test) 

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) 
find_package(Eigen3 REQUIRED) 
include_directories(${EIGEN3_INCLUDE_DIR}) 
message("Found Eigen3 in: ${EIGEN3_INCLUDE_DIR}") 

add_executable(main test.cpp) 

Hat jemand eine Idee, was falsch läuft?

Mit freundlichen Grüßen, Julien

+0

Willkommen bei Stackoverflow. Die Suchpaket-Skripts verwenden normalerweise den Befehl ['find_path()'] (https://cmake.org/cmake/help/v3.4/command/find_path.html), um das Include-Verzeichnis des Pakets zu erkennen. Wenn es nicht automatisch gefunden wird, können Sie ['CMAKE_INCLUDE_PATH'] (https://cmake.org/cmake/help/v3.4/variable/CMAKE_INCLUDE_PATH.html) um den Pfad erweitern, in dem CMake suchen soll (siehe zB [hier]). (http://stackoverflow.com/questions/3808775/cmake-doesnt-find-boost)). Sie könnten also etwas wie "list (APPEND CMAKE_INCLUDE_PATH"/usr/local/include ") vor Ihrem' find_package() 'Befehl einfügen. – Florian

+0

Danke! Wenn ich den genauen Pfad zum 'CMAKE_INCLUDE_PATH 'hinzufüge, findet es das Paket - aber sucht nicht manuell genau, was ich vermeiden will? Sollte das 'find_package()' das nicht für mich tun? – Julien

+0

Sie haben Recht. Der 'CMAKE_INCLUDE_PATH' war für einen nicht standardmäßigen' Eigen'-Installationspfad gedacht. Ich habe Ihrem Code-Beispiel einen Versuch gegeben und - wenn ich "Eigen" in den Standardpfad installiere - scheint es zu funktionieren, ohne den Pfad angeben zu müssen (siehe meine Antwort). Wenn Sie den 'Eigen'-Installationsprozess bereits verwendet haben, könnten Sie bitte weitere Details zu Ihrer Umgebung hinzufügen (CMake-Version, CMake-Befehlszeilenaufruf, Host-Betriebssystem, Compiler-Version, ...)? – Florian

Antwort

4

meines Kommentars in eine Antwort Turning

Die Paket Skripte - wie FindEigen3.cmake - in der Regel verwenden Sie die find_path() Befehl des Pakets umfassen Verzeichnis zu erfassen (it's documentation für die volle sehen Einzelheiten).

FindEigen3.cmake verwendet den folgenden Code-Schnipsel:

find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library 
    PATHS 
    ${CMAKE_INSTALL_PREFIX}/include 
    ${KDE4_INCLUDE_DIR} 
    PATH_SUFFIXES eigen3 eigen 
) 

So sieht es in CMAKE_INSTALL_PREFIX, die auf Unix/Linux-Hosts sind /usr/local standardmäßig.

Folgendes hat für mich gearbeitet:

  • Zum Eigen Quellverzeichnis und die CMake laufen und Installationsschritte

    > mkdir build 
    > cd build 
    > cmake .. 
    > make install 
    
  • Dann kopieren - wie Sie getan haben - FindEigen3.cmake auf Ihre Quellverzeichnis des Projekts.

  • Jetzt ist Ihr Code tut Eigen finden (nur geändert list(APPEND ...))

    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}") 
    find_package(Eigen3 REQUIRED) 
    

Referenzen

+0

Perfekt, es funktioniert jetzt! Ich denke, was auch Probleme verursachte ist, dass ich '$ make install' nicht benutzt habe, um die Library zu installieren, sondern einfach in meine'/usr/local/include' kopiert habe. Das Verzeichnis, nach dem 'FindEigen3.cmake' gesucht hat, war wahrscheinlich zu tief (es war irgendwo in'/usr/include/Eigen_all/eigen-tar-ordnername/'). Wie auch immer - vielen Dank für Ihre ausführliche Antwort! – Julien

0

Fügen Sie den Pfad von FindEigen3.cmake vor find_package(Eigen3 REQUIRED), wie folgt aus:

LIST(APPEND CMAKE_MODULE_PATH "/usr/share/cmake-2.8/Modules/") 
find_package(Eigen3)