2012-09-03 15 views
12

के लिए पैकेज Eigen3 खोजें सीएमके मेरा Eigen3 पैकेज नहीं ढूंढ सकता। मैं एक वातावरण चरसीएमके

EIGEN3_INCLUDE_DIR 

कहा जाता पथ जहाँ FindEigen3.cmake है की ओर इशारा करते निर्धारित किया है।

फिर CMakelists.txt में मैं ने लिखा है:

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) 

मैं क्या याद आ रही है या गलत कर पर कोई विचार:

find_package(Eigen3 REQUIRED) 
include_directories(EIGEN3_INCLUDE_DIR) 

मैं त्रुटि की अगली संदेश मिलता है?

उत्तर

18

Eigen3 के बाद से पूरी तरह से केवल शीर्षक है, तुम सब कभी जरूरत शामिल निर्देशिका के लिए पथ है। और यह एक, आप पहले से ही मैन्युअल रूप से परिभाषित कर रहे हैं। तो FindEigen3.cmake या FIND_PACKAGE कॉल के लिए कोई वास्तविक आवश्यकता नहीं है।

  1. आप एक CMake चर के सामग्री तक पहुँचने के लिए चाहते हैं, ${...} का उपयोग सुनिश्चित करें:

    सीधे शब्दों में

    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}") 
    

    कुछ नोट्स का उपयोग

  2. $ENV{....} पर्यावरण चर का उपयोग करता है।
  3. दूसरे उदाहरण एक त्रुटि के साथ बंद हो जाएगा अगर वातावरण चर सेट नहीं है (और इस प्रकार, EIGEN3_INCLUDE_DIR cmake चर खाली है)
  4. उद्धरण चिह्नों के आसपास (का मूल्यांकन) चर का उपयोग करने के लिए सावधान रहें अगर वे खाली स्थान के हो सकता है। अन्यथा, सीएमके इसे एक सूची के रूप में व्याख्या करेगा।
  5. यदि आप कस्टम खोज मॉड्यूल का उपयोग करना चाहते हैं, तो सुनिश्चित करें कि आप उन्हें सीएमके इंस्टॉलेशन में रखें या @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> ...) सामान्य रूप में उपयोग कर सकते हैं। documentation of FIND_PACKAGE देखें विवरण के लिए।
+3

हां, यह वह उत्तर जिसे मैं ढूंढ रहा था। कुंजी ** $ ENV ** है, धन्यवाद आदमी। मैंने इस पोस्ट के साथ बहुत कुछ सीखा। –

+0

** संदेश (FATAL_ERROR "के बाद बंद होने वाले समापन कोष्ठक कृपया अपने Eigen3 स्थापना की निर्देशिका को शामिल करने के लिए पर्यावरण परिवर्तनीय EIGEN3_INCLUDE_DIR को इंगित करें।" ** – 3yanlis1bos

+0

Eigen3 निर्देशिका शामिल करें? –

1

आप "cmake" नाम Eigen उपनिर्देशिका के स्थान पर CMAKE_MODULE_PATH को सेट कर सकें:

cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/ 
+0

और मैं इसे कमांड लाइन के बजाय cmakelists में कैसे लिख सकता हूं? –

+0

स्थानीय रूप से चर सेट करने के लिए 'SET (...)' कमांड का उपयोग करें। –

6

सबसे पहले, सुनिश्चित करें कि Eigen ठीक से स्थापित है। टैरबॉल के साथ आने वाली INSTALL फ़ाइल का संदर्भ लें।

दूसरा, cmake/FindEigen3.cmake फ़ाइल को टैरबॉल से 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}") कि यह बाह्य निर्भरताओं को खोजने के लिए सीएमके के मानक तंत्र का उपयोग करता है, जिससे किसी अन्य प्लेटफ़ॉर्म पर संभवतः परियोजना को चुनने के लिए किसी और (या भविष्य के स्वयं) के लिए यह आसान हो जाता है।

(हालांकि, यह अच्छा होगा यदि Eigen अपने आप में एक EigenConfig.cmake फ़ाइल स्थापित हो सकता है, किसी भी अतिरिक्त पथ के बिना find_package तंत्र के माध्यम से यह सुलभ बनाने।)

+1

नहीं, Eigen cmake config पैकेज फ़ाइलों को स्थापित करना चाहिए। Http: //www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#creating-packages – steveire

+0

शायद यह होना चाहिए, लेकिन यह एक पूर्ण उपाय नहीं है। अगर ईजिन स्थापित नहीं किया गया था, तो त्रुटि संदेश अधिक गुप्त होंगे, ज्यादातर सीएमके के चारों ओर घूमते हुए FindEigen3.cmake फ़ाइल को स्वयं नहीं ढूंढ पाएंगे ... जो आपको अपने पैकेज में फ़ाइल को शामिल करने के लिए संकेत दे सकता है। पोस्ट संपादित करें – Emil

+0

आप अवधारणाओं को मिश्रित कर रहे हैं। जिस दस्तावेज़ से मैंने लिंक किया है (और लिखा), Eigen EigenConfig.cmake इंस्टॉल करेगा, FindEigen.cmake नहीं। – steveire

4

मैं एक और समाधान here (जो here कहा जाता है) पाया जो पीकेजी-कॉन्फ़िगरेशन फ़ाइल का उपयोग करता है:

find_package(PkgConfig) 
pkg_search_module(Eigen3 REQUIRED eigen3)