2015-12-07 48 views
6

Tôi là loại tuyệt vọng: Đối với các nghiên cứu của tôi, tôi cần phải làm việc với Eigen và CMake. Tôi có thể sử dụng Eigen nếu tôi sao chép toàn bộ thư viện trong thư mục nơi biên dịch của tôi trông theo mặc định nhưng ngay sau khi tôi cố gắng để tìm thấy nó qua
find_package(Eigen3 REQUIRED)
tôi nhận được lỗi sau: Không thể tìm thấy Eigen3 với 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!


Bây giờ tôi đã tìm kiếm các giải pháp nhưng tất cả những gì tôi đã thử (cũng có sẵn trên stackoverflow:
Find package Eigen3 for CMake hoặc CMake Can't find Eigen3) không hoạt động. Phiên bản Eigen của tôi (theo các Macro trong Core/util/Macros.h) là 3.2.5. tôi giữ thư mục Eigen trong /usr/local/include, tôi sử dụng FindEigen3.cmake mà đi kèm với các thư viện Eigen và tôi CMakeLists.txt trông như sau:


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) 

Có ai có ý tưởng gì đang xảy ra vậy?

Kind regards, Julien

+0

Chào mừng bạn đến StackOverflow. Các kịch bản lệnh tìm gói thường sử dụng lệnh ['find_path()'] (https://cmake.org/cmake/help/v3.4/command/find_path.html) để phát hiện thư mục include của gói. Nếu nó không được tìm thấy tự động, bạn có thể mở rộng ['CMAKE_INCLUDE_PATH'] (https://cmake.org/cmake/help/v3.4/variable/CMAKE_INCLUDE_PATH.html) bằng đường dẫn mà CMake nên tìm kiếm (ví dụ xem [ở đây] (http://stackoverflow.com/questions/3808775/cmake-doesnt-find-boost)). Vì vậy, bạn có thể thêm một cái gì đó như 'danh sách (APPEND CMAKE_INCLUDE_PATH"/usr/local/include ")' trước lệnh 'find_package()' của bạn. – Florian

+0

Cảm ơn! Nếu tôi thêm đường dẫn chính xác vào 'CMAKE_INCLUDE_PATH', nó sẽ tìm thấy gói - nhưng không tìm kiếm theo cách thủ công chính xác những gì tôi muốn tránh? Không nên 'find_package()' làm điều đó cho tôi? – Julien

+0

Bạn nói đúng. 'CMAKE_INCLUDE_PATH' có nghĩa là cho một đường dẫn cài đặt' Eigen' không chuẩn. Tôi đã thử mẫu mã của bạn và - nếu tôi cài đặt 'Eigen' vào đường dẫn mặc định - có vẻ như nó hoạt động mà không cần cung cấp đường dẫn (xem câu trả lời của tôi). Nếu bạn đã sử dụng quá trình cài đặt 'Eigen', bạn có thể bổ sung thêm chi tiết về môi trường của bạn (phiên bản CMake, lệnh gọi dòng lệnh CMake, hệ điều hành máy chủ, phiên bản trình biên dịch, ...) không? – Florian

Trả lời

4

Biến nhận xét của tôi vào một câu trả lời

Phát hiện gói kịch bản - như FindEigen3.cmake - thường sử dụng lệnh find_path() để phát hiện của gói bao gồm thư mục (xem it's documentation cho đầy đủ chi tiết).

FindEigen3.cmake sử dụng đoạn mã sau:

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

Vì vậy, nó sẽ tìm trong CMAKE_INSTALL_PREFIX mà trên Unix/Linux host là /usr/local theo mặc định.

Sau đây đã làm việc cho tôi:

  • Vào thư mục nguồn Eigen và chạy CMake và lắp đặt các bước

    > mkdir build 
    > cd build 
    > cmake .. 
    > make install 
    
  • Sau đó, sao chép - như bạn đã làm - FindEigen3.cmake để bạn dự án nguồn thư mục.

  • Bây giờ mã của bạn không tìm Eigen (chỉ cần thay đổi để list(APPEND ...))

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

Tài liệu tham khảo

+0

Hoàn hảo nó hoạt động ngay bây giờ! Tôi nghĩ rằng những gì cũng gây ra vấn đề là, rằng tôi đã không sử dụng '$ make install' để cài đặt Thư viện nhưng chỉ sao chép nó trong'/usr/local/include' của tôi. Thư mục 'FindEigen3.cmake' đang tìm kiếm có lẽ quá sâu (nó nằm ở đâu đó trong'/usr/include/Eigen_all/eigen-tar-folder-name/'). Anyways - cảm ơn bạn rất nhiều vì câu trả lời chi tiết của bạn! – Julien

0

Thêm đường dẫn của FindEigen3.cmake trước find_package(Eigen3 REQUIRED), như thế này:

LIST(APPEND CMAKE_MODULE_PATH "/usr/share/cmake-2.8/Modules/") 
find_package(Eigen3) 
Các vấn đề liên quan