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)
何が欠けているのか、間違っているのかについてのアイデアはありますか?
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}" )
いくつかのメモ:
${...}
を使用してください$ENV{....}
は環境変数にアクセスします。CMAKE_MODULE_PATH
がそのディレクトリを指していることを確認してください。確かではありませんが、CMakeは現在のディレクトリも自動的にチェックする可能性があります(CMakeLists.txt
が存在する場所。とにかく、EIGEN3_INCLUDE_DIR
の設定はFindEigen3.cmake
の場所とはまったく関係ありません)FindEigen3
スクリプトがこの変数を評価して、Eigen3インストールの場所を決定する可能性があります。<PackageName>Config.cmake
を提供します。 <PackageName>_DIR
という変数をこのファイルを含むディレクトリにポイントすると、通常どおりFIND_PACKAGE( <PackageName> ...)
を使用できます。詳細については、 FIND_PACKAGEのドキュメント を参照してください。まず、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
_メカニズムを介してアクセスできるようにすると良いでしょう。)
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
を使用する-可能な場合は常にターゲットアプローチを推奨する必要があります。
CMAKE_MODULE_PATH
「cmake」という名前のEigenサブディレクトリの場所:
cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/
環境変数に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})
別の簡単な方法は次のとおりです。
eigenライブラリーが/opt/eigen/3.3/Eigenにある場合
include_directories(/opt/eigen/3.3)
これは、ジェイが提案したものと同等です
set(EIGEN_DIR "/opt/eigen/3.3")
include_directories(${EIGEN_DIR})
環境変数を追加する必要のないもう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}" )