CMake cannot find my Eigen3 package. I set an environment variable called
EIGEN3_INCLUDE_DIR
pointing to the path where FindEigen3.cmake
is.
Then in the CMakelists.txt I wrote:
find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )
I get next message of 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)
Any idea on what I am missing or doing wrong?
First, make sure Eigen is properly installed. Refer to the
INSTALL
file that comes with the tarball.Second, copy the
cmake/FindEigen3.cmake
file from the tarball to the directory containing yourCMakeLists.txt
.In your
CMakeLists.txt
add:Now you should be able to do e.g.
#include <Eigen/Core>
.All of this comes (mostly) from this source.
This approach has the advantage over e.g.
include_directories("$ENV{EIGEN3_INCLUDE_DIR}")
that it the uses CMake's standard mechanism for finding external dependencies, making it easier for someone else (or your future self) to pick up the project, possibly on another platform.(However, it would be nice if Eigen itself installed an EigenConfig.cmake file, making it accessible through the
find_package
mechanism without any extra paths.)Eigen >= 3.3 has direct CMake integration, so it seems yours isn't set up correctly.
Assume Eigen has been installed to
/opt/eigen/3.3
with default settings. Append or prepend the the location/opt/eigen/3.3/share/eigen3/cmake
to the environment variableCMAKE_PREFIX_PATH
e.g in bash:Then CMake should pick it up.
If you are writing your own CMakeLists.txt that uses Eigen I suggest using code like this:
You should not use
include_directories
since CMake 3 was released -- the targets approach should be preferred whenever available.Another simple way is:
if the Eigen library is in /opt/eigen/3.3/Eigen
include_directories(/opt/eigen/3.3)
which is equivalent to what Jai suggested
I found another solution here (which referred to here) which uses the pkg-config file :
If you have not added Eigen Library to environment variable then do the following in
CMakeLists.txt
:Since Eigen3 is completely header only, all you ever need is the path to the include directory. And this one, you are already defining manually anyway. So there is no real need for a
FindEigen3.cmake
orFIND_PACKAGE
call.Simply use
or
A few notes:
${...}
$ENV{....}
accesses environment variables.CMAKE_MODULE_PATH
to the directory where it is. Not sure, but it could be that CMake checks the current directory as well automatically (where yourCMakeLists.txt
resides. Anyhow, settingEIGEN3_INCLUDE_DIR
is totally unrelated to the location ofFindEigen3.cmake
FindEigen3
script evaluates this variable to determine the location of your Eigen3 installation.<PackageName>Config.cmake
. If you point a variable called<PackageName>_DIR
to the directory containing this file, you can useFIND_PACKAGE( <PackageName> ...)
as normal. See documentation of FIND_PACKAGE for details.