CMake无法找到我的 Eigen3 套餐。我设置了一个名为
的环境变量EIGEN3_INCLUDE_DIR
指向FindEigen3.cmake
所在的路径。
然后在CMakelists.txt中写道:
find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )
我收到下一条错误消息:
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)
对我遗失或做错的任何想法?
答案 0 :(得分:23)
由于Eigen3仅是完全标头,因此您只需要包含目录的路径。而这一个,你已经手动定义了。因此,实际上不需要FindEigen3.cmake
或FIND_PACKAGE
来电。
只需使用
INCLUDE_DIRECTORIES ( "$ENV{EIGEN3_INCLUDE_DIR}" )
或
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}" )
一些注意事项:
${...}
$ENV{....}
访问环境变量。CMAKE_MODULE_PATH
指向它所在的目录。不确定,但可能是CMake自动检查当前目录(CMakeLists.txt
所在的位置。无论如何,设置EIGEN3_INCLUDE_DIR
与FindEigen3.cmake
的位置完全无关FindEigen3
脚本评估此变量以确定您的Eigen3安装的位置。<PackageName>Config.cmake
。如果将名为<PackageName>_DIR
的变量指向包含此文件的目录,则可以正常使用FIND_PACKAGE( <PackageName> ...)
。有关详细信息,请参阅documentation of FIND_PACKAGE。 答案 1 :(得分:9)
首先,确保正确安装Eigen。请参阅tarball附带的INSTALL
文件。
其次,将cmake/FindEigen3.cmake
文件从tarball复制到包含CMakeLists.txt
的目录。
在CMakeLists.txt
添加:
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
现在你应该可以做到,例如#include <Eigen/Core>
。
所有这些(主要)来自此source。
这种方法优于例如include_directories("$ENV{EIGEN3_INCLUDE_DIR}")
它使用CMake的标准机制来查找外部依赖关系,使其他人(或您未来的自己)更容易接收项目,可能在另一个平台上。
(但是,如果Eigen本身安装了一个EigenConfig.cmake文件,可以通过find_package
机制访问它而不需要任何额外的路径,那就太好了。)
答案 2 :(得分:5)
Eigen> = 3.3具有直接的CMake集成,因此您的设置似乎不正确。
假定本征已使用默认设置安装到/opt/eigen/3.3
。将位置/opt/eigen/3.3
附加或附加到环境变量CMAKE_PREFIX_PATH
上,例如在bash中:
export CMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH:/opt/eigen/3.3"
然后CMake应该拿起它。
如果您要编写使用Eigen的CMakeLists.txt,我建议使用如下代码:
find_package (Eigen3 3.3 REQUIRED)
add_executable (example example.cpp)
target_link_libraries (example Eigen3::Eigen)
自CMake 3发布以来,您不应使用include_directories
-只要有目标,应首选目标方法。
答案 3 :(得分:4)
我找到了另一个使用pkg-config文件的解决方案here(引用here):
find_package(PkgConfig)
pkg_search_module(Eigen3 REQUIRED eigen3)
答案 4 :(得分:1)
您可以尝试将CMAKE_MODULE_PATH
设置为名为“cmake”的Eigen子目录的位置:
cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/
答案 5 :(得分:1)
如果您尚未将Eigen Library添加到环境变量,请在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})
答案 6 :(得分:1)
另一种不需要添加环境变量的简单方法是仅使用cmake find_path函数https://cmake.org/cmake/help/v3.6/command/find_path.html查找本征。示例代码在子目录“ eigen3”中进行了附加搜索,在路径“ / usr / include /”和“ / usr / local / include”中找到目录“ Eigen”。
find_path(EIGEN3_INCLUDE_DIRS "Eigen" paths "/usr/include" "/usr/local/include" path_suffixes "eigen3")
message(${EIGEN3_INCLUDE_DIRS})
if ( NOT EIGEN3_INCLUDE_DIRS )
message(FATAL_ERROR "CMake variable EIGEN3_INCLUDE_DIRS not found.")
endif()
include_directories ( "${EIGEN3_INCLUDE_DIRS}" )
答案 7 :(得分:1)
作为约翰内斯最佳答案中注释7 的详细说明。通过使用CMake find_packate()的“配置模式”而不是“模块模式”,仅写入
find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )
CMakeLists.txt中的就足够了。
请参阅本征源代码目录中包含的安装指导文本文件(例如,摘录自从official website下载的eigen-3.3.7.tar.gz), :
Method 2. Installing using CMake
********************************
Let's call this directory 'source_dir' (where this INSTALL file is).
Before starting, create another directory which we will call 'build_dir'.
Do:
cd build_dir
cmake source_dir
make install
The "make install" step may require administrator privileges.
You can adjust the installation destination (the "prefix")
by passing the -DCMAKE_INSTALL_PREFIX=myprefix option to cmake, as is
explained in the message that cmake prints at the end.
就像在计算机上安装常规的CMake项目一样。
与直接包含 / usr / include / eigne3 或 / usr / local / include / eigen3 目录的区别在于,配置目录称为 eigen3 / cmake 也将安装到 / usr / share 或 usr / local / share 。此配置目录包含 Eigen3Config.cmake 文件,CMake可以自动找到该文件以找到eigen3目录。
答案 8 :(得分:0)
在github上的项目克隆上的Google Colab上运行cmake .. && make
时,我遇到了类似的问题。我通过编辑CMakeLists.txt文件并将此行添加到其中来对其进行了修复:
set(EIGEN3_INCLUDE_DIR "/usr/include/eigen3")
如您所见,我的eigen3位于/ usr / include / eigen3路径中(并且我已经使用!sudo apt-get install build-essential cmake libeigen3-dev
安装了它)
答案 9 :(得分:-1)
另一种简单的方法是:
如果Eigen库位于/opt/eigen/3.3/Eigen
include_directories(/opt/eigen/3.3)
等同于Jai的建议
set(EIGEN_DIR "/opt/eigen/3.3")
include_directories(${EIGEN_DIR})