2013-09-05 50 views
12

我正在嘗試在我的代碼中使用vtk,但我在運行示例時遇到了問題。我幾乎不知道這些原因,因爲這是我第一次使用它,而且我不是很有經驗。 我正在使用visual studio 2012和x64平臺。 由於我不知道應該使用哪個庫,我將它們全部添加到「其他依賴項」中。 該示例在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) 

這Visual Studio中顯示錯誤

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

不任何人都知道如何解決這個問題,或者至少這個錯誤是什麼意思?

+1

您是否使用CMake編譯過您的項目?如果沒有,這可能是原因......將VTK與VS集成並不是一項短的任務...檢查[本指南](http://guitarcplusplus.blogspot.it/2013/02/itk-vtk-qt-on -window-7-64bit-and-visual.html)來查看我在說什麼(我知道,這是關於VS2010和VTK的前一版本......並且您可以跳過Qt和ITK的部分以及... ) –

+0

是的,我編譯它。我沒有檢查BUILD_SHARED_LIBS,因爲我更喜歡使用靜態的。 – German

回答

10

我也是得到這個錯誤。該錯誤意味着鏈接程序無法找到vtkPolyDataMapper方法的定義。必須注意在構建過程中他們使用了哪個vtk渲染後端。它可能是vtkRenderingOpenGL或vtkRenderingOpenGL2。轉到您的build/lib文件夾並搜索其中任何一個。我有VS 2015社區並擁有vtkRenderingOpenGL2,vtk-7.1構建於Windows 8.1,x86_64 Platform,Release配置上。

我通過在我的源文件最頂端插入3個以下行固定的問題,任何其他預處理指令前:

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

這將初始化指定的VTK模塊。 CMake默認包含這些,但是其他編譯器如VS不會。

最後兩行可以組合成如下:

#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle) 
+0

我不知道這是否解決了問題,因爲我在更新到新版本後停止了這個問題。如果有人能夠測試它,請在下面評論。 – German

+0

嗯,我當然會對它進行測試。它的工作原理。正如我所提到的,這是最新版本的VTK-7.1。 –

+0

我用VTK-8.0.1測試過它,它對我很有用。 – Jayz7522

3

您在您的CMakeLists.txt文件中丟失了include(${VTK_USE_FILE})

13

根據VTK migration guide,如果您不使用CMake來編譯您的代碼,您需要添加一些#define s。對於VTK 6.0,這些線路需要之前去任何其他VTK #include S:

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

我會建議指導here以下,與VTK_MODULE_INIT宏是最可靠的,具有the guide here提供一個高層次的概述需要的變化。例如,您必須鏈接到vtkRenderingOpenGL才能獲得大部分標準覆蓋。如果使用CMake,那麼在find_package的COMPONENTS參數上指定它會將其添加到VTK_LIBRARIES,並且包括VTK_USE_FILE會導致添加正確的編譯器定義。

1

當使用paraview包的催化劑庫,你必須在另外下面添加到include("${PARAVIEW_USE_FILE}")

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

快速黑客解決方案:在CMakeList.txt文件,替換vtkRendering $ {} VTK_RENDERING_BACKEND與vtkRenderingOpenGL2。我們需要這個的原因是因爲Cmake不知道渲染核心在哪裏。通過指定它,我們可以使用渲染核心來覆蓋正確的方法。

正確的解決方案應該是更換整個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

我在我的平臺相同的問題; 的Visual Studio 2015年 Windows 7的 VTK 6.3

我跟着VTK/Build System Migration馬庫斯D.漢威爾的帖子,和它的作品。我的附加線是;

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

位於預處理器的頂部。與RestlessC0bra的帖子的區別可能是OpenGL版本。

2

假設你正在使用OpenGL2,你應該初始化vtkRenderingOpenGL2模塊,確保其對象工廠爲正確註冊:(前main.cpp

VTK_MODULE_INIT(vtkRenderingOpenGL2) 

你應該調用此宏在全球範圍內爲documented in the source code

初始化已命名的模塊,確保其對象工廠 已正確註冊和取消註冊。此調用必須在您的可執行文件的翻譯單元(其中 包含一個共享庫,但在靜態 庫中不會如預期的那樣工作)的全局作用域中進行。

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

如果包括在全球範圍內將保證 對象工廠爲vtkRenderingOpenGL是否正確註冊和未註冊 上面的代碼片段。

你怎麼知道包含哪個模塊?

最簡單的方法是在VTK建立文件夾搜索"vtkClassThatNeedsAnOverride",即"vtkPolyDataMapper"你的情況(請注意使用引號"的。),並希望在搜索結果中的*ObjectFactory

渲染/OpenGL2/vtkRenderingOpenGL2ObjectFactory.cxx:

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

它可能更利於尋找RegisterOverride("vtkPolyDataMapper"

哪些對象工廠存在?

要獲取可以初始化的所有現有模塊的列表,您可以搜索_AutoInit_Construct*_AutoInit_Construct是由VTK_MODULE_INIT調用的方法。

作爲替代方案,您可以查看從vtkObjectFactory派生的所有類。

第二種方法是查找所有對RegisterOverride的呼叫。

更多信息

注意,我原來寫調用include(${VTK_USE_FILE})VTK_MODULE_INIT使用cmake的手動這個答案爲duplicate question,但我認爲有關解決此問題的一般信息可能會對具有相同錯誤消息的其他人感興趣。