web-dev-qa-db-ja.com

CMakeのEigen3パッケージを見つける

CMakeは、私のEigenパッケージを見つけることができません。という環境変数を設定します

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)

何が欠けているのか、間違っているのかについてのアイデアはありますか?

20
Jav_Rock

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

いくつかのメモ:

  1. CMake変数のcontentにアクセスする場合は、必ず${...}を使用してください
  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のドキュメント を参照してください。
27
Johannes S.

まず、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_メカニズムを介してアクセスできるようにすると良いでしょう。)

9
Emil

Eigen 3.3以降にはCMakeが直接統合されているため、正しく設定されていないようです。

Eigenが/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を使用する-可能な場合は常にターゲットアプローチを推奨する必要があります。

5
Levi Morrison

私は別の解決策を見つけました here (これは here を参照)pkg-configファイルを使用します:

find_package(PkgConfig)
pkg_search_module(Eigen3 REQUIRED eigen3)
4
agold

CMAKE_MODULE_PATH「cmake」という名前のEigenサブディレクトリの場所:

cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/
1
Fraser

環境変数にEigenライブラリを追加していない場合は、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})
1
Jai

別の簡単な方法は次のとおりです。

eigenライブラリーが/opt/eigen/3.3/Eigenにある場合

include_directories(/opt/eigen/3.3)

これは、ジェイが提案したものと同等です

set(EIGEN_DIR "/opt/eigen/3.3")
include_directories(${EIGEN_DIR})
0
Cloud Cho

環境変数を追加する必要のないもう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}" )
0
Juiz06