2013-09-05 2 views
12

के लिए कोई ओवरराइड नहीं मिला है, मैं अपने कोड में vtk का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे एक उदाहरण चलाने में समस्याएं आ रही हैं। मेरे पास कारणों के बारे में लगभग कोई सुराग नहीं है क्योंकि यह पहली बार है जब मैं इसका उपयोग कर रहा हूं और मैं बहुत अनुभवी नहीं हूं। मैं विजुअल स्टूडियो 2012 और x64 प्लेटफॉर्म का उपयोग कर रहा हूं। चूंकि मुझे वास्तव में पता नहीं है कि मुझे किस libs का उपयोग करना चाहिए, मैंने उन सभी को "अतिरिक्त निर्भरता" में जोड़ा। उदाहरण this link में दिया गया है। समस्या यह है कि जब मैं इसे चलाने के लिए, खिड़की इस संदेश'vtkPolyDataMapper'

Generic Warning: In C:\location\VTK6.0.0\Rendering\Core\vtkPolyDataMapper.cxx, line 27 
Error: no override found for 'vtkPolyDataMapper'. 

जो इस लाइन

// Return NULL if no override is supplied. 
vtkAbstractObjectFactoryNewMacro(vtkPolyDataMapper) 

और त्रुटि है कि दृश्य स्टूडियो से पता चलता से मेल खाती है है से पता चलता है

First-chance exception at 0x000007F7AA106C8F in Test.exe: 0xC0000005: Access violation reading location 0x0000000000000000. 

करता है किसी को भी इस समस्या को हल करने के बारे में पता है या कम से कम इस त्रुटि का क्या अर्थ है?

+1

क्या आपने सीएमके का उपयोग करके अपनी परियोजना संकलित की है? यदि नहीं, तो यह कारण हो सकता है ... वीएस के साथ वीटीके को एकीकृत करना एक छोटा काम नहीं है ... [इस गाइड] की जांच करें (http://guitarcplusplus.blogspot.it/2013/02/itk-vtk-qt-on -विंडो-7-64 बिट-और-विज़ुअल.html) यह देखने के लिए कि मैं किस बारे में बात कर रहा हूं (मुझे पता है, यह वीएस -2010 और वीटीके के पिछले संस्करण के बारे में है ... और आप क्यूटी और आईटीके के हिस्सों को भी छोड़ सकते हैं ...) –

+0

हां, मैंने इसे संकलित किया था। मैंने BUILD_SHARED_LIBS की जांच नहीं की क्योंकि मैं स्थिर लोगों का उपयोग करना पसंद करता हूं। – German

उत्तर

10

मुझे भी यह त्रुटि मिल रही थी। त्रुटि का अर्थ है कि लिंकर vtkPolyDataMapper विधि की परिभाषा नहीं ढूंढ सकता है। किसी को यह ध्यान रखना होगा कि निर्माण के दौरान, वे किस वीटीके प्रतिपादन बैकएंड का इस्तेमाल करते थे। यह शायद या तो vtkRenderingOpenGL, या vtkRenderingOpenGL2 होगा। अपने निर्माण/lib फ़ोल्डर पर जाएं और इनमें से किसी एक के लिए खोजें। मेरे पास वीएस 2015 समुदाय है और vtkRenderingOpenGL2 था, vtk-7.1 विंडोज 8.1, x86_64 प्लेटफार्म, रिलीज कॉन्फ़िगरेशन पर बनाया गया था।

मैं अपने स्रोत फ़ाइलों के शीर्ष पर 3 निम्नलिखित लाइनों डालने से समस्या का समाधान हो किसी अन्य पूर्वप्रक्रमक निर्देशों से पहले:

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 
VTK_MODULE_INIT(vtkInteractionStyle); 

यह निर्दिष्ट VTK मॉड्यूल initializes। सीएमके में इन्हें डिफ़ॉल्ट रूप से शामिल किया गया है, लेकिन वीएस जैसे अन्य कंपाइलर नहीं हैं। निम्नलिखित

अंतिम दो पंक्तियों में जोड़ा जा सकता:

#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle) 
+0

मुझे यकीन नहीं है कि यह समस्या को हल करता है क्योंकि मैंने इसे एक नए संस्करण में अपडेट करने के बाद इसे रोकना बंद कर दिया है। अगर कोई इसका परीक्षण करने में सक्षम है, तो कृपया नीचे टिप्पणी करें। – German

+0

ठीक है, मैंने इसे स्वयं परीक्षण किया है। और यह काम करता है। जैसा कि मैंने उल्लेख किया है, यह नवीनतम संस्करण वीटीके-7.1 है। –

+0

मैंने इसे VTK-8.0.1 के साथ परीक्षण किया, और यह मेरे लिए काम किया। – Jayz7522

3

आप अपने CMakeLists.txt फ़ाइल में include(${VTK_USE_FILE}) खो रहे हैं।

13

VTK migration guide के अनुसार, यदि आप अपने कोड को संकलित करने के लिए सीएमके का उपयोग नहीं कर रहे हैं, तो आपको कुछ #define एस जोड़ने की आवश्यकता है। का एक उच्च स्तरीय सिंहावलोकन प्रदान

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL) 
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL) 
2

मैं गाइड here निम्नलिखित की सिफारिश करेंगे VTK_MODULE_INIT मैक्रो सबसे विश्वसनीय होने के साथ, the guide here साथ: VTK 6.0 के लिए, इन पंक्तियों से पहले जाना किसी अन्य VTK #include रों जरूरत परिवर्तन की जरूरत है। उदाहरण के लिए आपको मानक ओवरराइड प्राप्त करने के लिए vtkRenderingOpenGL से लिंक करना होगा। यदि आप सीएमके का उपयोग करते हैं तो इसे घटक के तर्क पर निर्दिष्ट करने के लिए find_package को VTK_LIBRARIES में जोड़ा जाएगा, और VTK_USE_FILE सहित सही कंपाइलर परिभाषाओं को जोड़ा जाएगा।

1

पाराव्यू के उत्प्रेरक का उपयोग करते समय पुस्तकालयों आप include("${PARAVIEW_USE_FILE}") के अलावा निम्नलिखित जोड़ने के लिए:

set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${VTK_DEFINITIONS}) 
1

एक त्वरित हैक समाधान: CMakeList.txt फ़ाइल में बदलने के vtkRendering $ {VTK_RENDERING_BACKEND} vtkRenderingOpenGL2 साथ हमें इसकी आवश्यकता क्यों है क्योंकि सीमेक नहीं जानता कि प्रतिपादन कोर कहां है। इसे निर्दिष्ट करके, हम उचित विधि को ओवरराइड करने के लिए प्रतिपादन कोर का उपयोग कर सकते हैं।

उचित समाधान के साथ पूरे find_package पैरा की जगह होना चाहिए:

find_package(VTK REQUIRED COMPONENTS vtkCommonCore) 
find_package(VTK COMPONENTS 
    vtkFiltersSources 
    vtkInteractionStyle 
    vtkRendering${VTK_RENDERING_BACKEND}) 

पहले find_package CMake पता जहां संकुल को खोजने के लिए की सुविधा देता है, तो दूसरा find_package पता जहां vtkRendering $ {VTK_RENDERING_BACKEND} को खोजने के लिए होगा

1

मैं अपने मंच पर एक ही मुद्दा था, विजुअल स्टूडियो 2015 विंडोज 7 VTK 6.3

मैं मार्कस डी हन्वेल्ल की पोस्ट से VTK/Build System Migration पीछा किया, और यह काम करता है। मेरी additonal लाइनें हैं;

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL); 
VTK_MODULE_INIT(vtkInteractionStyle); 

प्रीप्रोसेसर के शीर्ष पर। RestlessC0bra की पोस्ट से अंतर शायद ओपनजीएल संस्करण है। documented in the source code रूप

VTK_MODULE_INIT(vtkRenderingOpenGL2) 

आप वैश्विक क्षेत्र में इस मैक्रो बुलाना चाहिए:

2

मानते हुए अपने OpenGL2 उपयोग कर रहे हैं, तो आप vtkRenderingOpenGL2 मॉड्यूल आरंभ करना चाहिए, यह सुनिश्चित अपनी वस्तु कारखाना ठीक से पंजीकृत है (पूर्व main.cpp।):

नामित मॉड्यूल आरंभ करें, इसकी ऑब्जेक्ट फैक्टरी सुनिश्चित करना सही ढंग से पंजीकृत और अनियंत्रित है। यह कॉल आपके निष्पादन योग्य की अनुवाद इकाई में वैश्विक दायरे में बनाया जाना चाहिए (जो साझा लाइब्रेरी शामिल कर सकता है, लेकिन स्थिर लाइब्रेरी में अपेक्षित कार्य नहीं करेगा)।

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL); 

ऊपर टुकड़ा अगर वैश्विक क्षेत्र में शामिल vtkRenderingOpenGL सही ढंग से पंजीकृत हैं और अपंजीकृत के लिए वस्तु कारखानों को सुनिश्चित करेगा।

आप कैसे जानते हैं कि कौन सा मॉड्यूल शामिल करना है?

प्रतिपादन:

सबसे आसान तरीका, "vtkClassThatNeedsAnOverride" के लिए फ़ोल्डर VTK निर्माण में खोज करने के लिए यानी "vtkPolyDataMapper" अपने मामले में (। ध्यान दें उद्धरण " के उपयोग) और एक *ObjectFactory अपने खोज परिणामों में की तलाश में है /OpenGL2/vtkRenderingOpenGL2ObjectFactory.cxx:

this->RegisterOverride("vtkPolyDataMapper", 
         "vtkOpenGLPolyDataMapper", 
         "Override for vtkRenderingOpenGL2 module", 1, 
         vtkObjectFactoryCreatevtkOpenGLPolyDataMapper); 

यह और भी फायदेमंददेखने के लिए हो सकता है 0।

कौन सा ऑब्जेक्ट कारखानों मौजूद हैं?

आरंभ करने वाले सभी मौजूदा मॉड्यूल की एक सूची प्राप्त करने के लिए, आप _AutoInit_Construct खोज सकते हैं।*_AutoInit_Construct वह विधि है जिसे VTK_MODULE_INIT द्वारा बुलाया जाता है।

वैकल्पिक रूप से, आप vtkObjectFactory से प्राप्त होने वाली सभी कक्षाओं को देख सकते हैं।

RegisterOverride पर सभी कॉल देखने के लिए दूसरा विकल्प है।

अधिक जानकारी

ध्यान दें कि मैं मूल रूप से लिखा include(${VTK_USE_FILE}) फोन करके मैन्युअल cmake का उपयोग कर VTK_MODULE_INIT कॉल करने के लिए की जरूरत नहीं हैके लिए यह उत्तर, लेकिन मुझे लगता है कि इस समस्या को हल करने के बारे में सामान्य जानकारी एक ही त्रुटि संदेश वाले अन्य लोगों के लिए ब्याज की हो सकती है।

संबंधित मुद्दे