Проблема с включением библиотеки Eigen в Clion CMake - PullRequest
1 голос
/ 17 января 2020

У меня проблема с библиотекой Eigen. Я использую Clion на Linux, и мой проект не может найти библиотеку Eigen (она у меня в папке на рабочем столе).

У меня CMake в двух конфигурациях:

Первый:

cmake_minimum_required(VERSION 3.15)
project(TestFEM)

set(CMAKE_CXX_STANDARD 17)

set(EIGEN_DIR "~/Desktop/eigen-3.3.7")
include_directories(${EIGEN_DIR})

add_executable(TestFEM main.cpp FEM/FEM.cpp FEM/FEM.h)

И секунда:

cmake_minimum_required(VERSION 3.15)
project(TestFEM)

set(CMAKE_CXX_STANDARD 17)

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

add_executable(TestFEM main.cpp FEM/FEM.cpp FEM/FEM.h)

Все время у меня возникает такая ошибка:

fatal error: Eigen\Dense: No such file or directory

Как я могу это исправить?

1 Ответ

2 голосов
/ 18 января 2020

Сначала попробуйте использовать полный путь к каталогу Eigen (без ~).

set(EIGEN_DIR "/home/xxxx/Desktop/eigen-3.3.7")
include_directories(${EIGEN_DIR})

Кроме того, убедитесь, что путь действительно содержит Eigen/Dense, поэтому полный путь к файлу будет:

/home/xxxx/Desktop/eigen-3.3.7/Eigen/Dense

Лучшим подходом было бы использовать CMake для проверьте , что путь существует перед его использованием:

set(EIGEN_DIR "/home/xxxx/Desktop/eigen-3.3.7")
if(NOT EXISTS ${EIGEN_DIR})
    message(FATAL_ERROR "Please check that the set Eigen directory is valid!")
endif()
include_directories(${EIGEN_DIR})

Но вы можете быть еще более безопасным, проверив, что находитесь в правильном месте в репозитории Eigen, используя find_path(). В хранилище Eigen есть фиктивный файл signature_of_eigen3_matrix_library, который вы можете использовать для проверки того, что вы действительно нашли каталог верхнего уровня Eigen. Просто используйте предложение PATHS, чтобы указать CMake, где искать:

find_path(EIGEN_DIR NAMES signature_of_eigen3_matrix_library
    PATHS
    /home/xxxx/Desktop/eigen-3.3.7
    PATH_SUFFIXES eigen3 eigen
)
include_directories(${EIGEN_DIR})
...