33

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)

私が行方不明または間違っていることについて何か考えはありますか?

4

11 に答える 11

39

Eigen3 は完全にヘッダーのみであるため、必要なのはインクルード ディレクトリへのパスだけです。そしてこれは、とにかく手動で定義しています。FindEigen3.cmakeしたがって、 orFIND_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}" )

いくつかのメモ:

  1. CMake 変数のコンテンツにアクセスする場合は、必ず使用してください。${...}
  2. $ENV{....}環境変数にアクセスします。
  3. 2 番目の例は、環境変数が設定されていない場合 (したがって、EIGEN3_INCLUDE_DIR cmake 変数が空である場合)、エラーで停止します。
  4. 空白が含まれる可能性がある場合は、(評価された) 変数を引用符で囲むように注意してください。それ以外の場合、CMake はそれをリストとして解釈します。
  5. カスタム検索モジュールを使用する場合は、それらを CMake インストールに配置するか、上記の @Fraser が指摘したように、そのモジュールがCMAKE_MODULE_PATHあるディレクトリを指すようにしてください。確かではありませんが、CMakeが現在のディレクトリも自動的にチェックする可能性があります(あなたがCMakeLists.txt存在する場所。とにかく、設定EIGEN3_INCLUDE_DIRはの場所とはまったく関係ありませんFindEigen3.cmake
  6. ただし、FindEigen3スクリプトがこの変数を評価して、Eigen3 インストールの場所を特定する可能性があります。
  7. あるいは、自作の CMake ベースのプロジェクトでは、多くの場合、<PackageName>Config.cmake. このファイルを含むディレクトリを変数呼び出しで指定すれば、通常通り<PackageName>_DIR使えますFIND_PACKAGE( <PackageName> ...)。詳細については、FIND_PACKAGEのドキュメントを参照してください。
于 2012-09-04T07:40:54.857 に答える
11

まず、Eigen が正しくインストールされていることを確認します。INSTALLtarball に付属のファイルを参照してください。

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>

これはすべて(ほとんど)このソースから来ています。

include_directories("$ENV{EIGEN3_INCLUDE_DIR}")このアプローチには、たとえば、CMake の標準メカニズムを使用して外部依存関係を見つけ、他の誰か (または将来の自分) が別のプラットフォームでプロジェクトを簡単に取得できるという利点があります。

(ただし、Eigen 自体が EigenConfig.cmake ファイルをインストールし、find_package余分なパスなしでメカニズムを介してアクセスできるようにするとよいでしょう。)

于 2015-04-02T23:21:53.250 に答える
4

pkg-config ファイルを使用する別の解決策をここで見つけました(ここで参照)。

find_package(PkgConfig)
pkg_search_module(Eigen3 REQUIRED eigen3)
于 2015-11-22T00:29:01.447 に答える
3

Johannesのトップアンサーからの注7の詳細な説明として。CMakeのfind_packate()の「モジュールモード」ではなく「構成モード」を使うことで、

find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )

CMakeLists.txt で十分です。

固有ソース コード ディレクトリに含まれるINSTALLガイダンス テキスト ファイルを参照してください(例:公式 Web サイトからダウンロードした eigen-3.3.7.ta​​r.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 ディレクトリが特定されます。

于 2020-01-01T11:46:41.090 に答える
1

CMAKE_MODULE_PATH「cmake」という名前の Eigen サブディレクトリの場所に設定してみてください。

cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/
于 2012-09-04T00:46:13.027 に答える