web-dev-qa-db-ja.com

'vtkPolyDataMapper'のオーバーライドが見つかりません

コードでvtkを使用しようとしていますが、例の実行に問題があります。初めて使うので、あまり経験がないので、理由はほとんどわかりません。 Visual Studio2012とx64プラットフォームを使用しています。どのライブラリを使用すべきか本当にわからないので、それらすべてを「追加の依存関係」に追加しました。例は このリンク に示されています。問題は、実行するとウィンドウにこのメッセージが表示されることです

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.

誰かがこの問題を解決する方法を知っていますか、または少なくともこのエラーはどういう意味ですか?

18
German Capuano

私もこのエラーが発生していました。このエラーは、リンカがvtkPolyDataMapperメソッドの定義を見つけられないことを意味します。ビルド中に、使用したvtkレンダリングバックエンドに注意する必要があります。おそらくvtkRenderingOpenGLまたはvtkRenderingOpenGL2のいずれかになります。 build/libフォルダーに移動し、これらのいずれかを検索します。私はVS2015コミュニティを持っており、vtkRenderingOpenGL2を持っていました。vtk-7.1はWindows 8.1、x86_64プラットフォーム、リリース構成で構築されています。

他のプリプロセッサディレクティブの前に、ソースファイルの最上部に次の3行を挿入することで、この問題を修正しました。

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

これにより、指定されたVTKモジュールが初期化されます。 CMakeにはデフォルトでこれらが含まれていますが、VSなどの他のコンパイラには含まれていません。

最後の2行は、次のように組み合わせることができます。

#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle)
24
Nikos

VTK移行ガイド によると、CMakeを使用してコードをコンパイルしていない場合は、いくつかの#defineを追加する必要があります。 VTK 6.0の場合、これらの行は他のVTK #includesの前移動する必要があります。

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
14
Tom Fenech

CMakeLists.txtファイルにinclude(${VTK_USE_FILE})がありません。

4
andybauer

OpenGL2を使用していると仮定すると、vtkRenderingOpenGL2モジュールを初期化して、そのオブジェクトファクトリが正しく登録されていることを確認する必要があります。

VTK_MODULE_INIT(vtkRenderingOpenGL2)

このマクロは、グローバルスコープ(例:main.cpp)で ソースコードに記載されています :と呼ぶ必要があります。

名前付きモジュールを初期化し、そのオブジェクトファクトリが正しく登録および登録解除されていることを確認します。この呼び出しは、実行可能ファイルの変換ユニットのグローバルスコープで行う必要があります(共有ライブラリを含めることができますが、静的ライブラリでは期待どおりに機能しません)。

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

上記のスニペットがグローバルスコープに含まれている場合、vtkRenderingOpenGLのオブジェクトファクトリが正しく登録および登録解除されます。

どのモジュールを含めるかをどうやって知るのですか?

最も簡単な方法は、VTKビルドフォルダーで"vtkClassThatNeedsAnOverride"、つまり"vtkPolyDataMapper"を検索し(引用符"の使用に注意)、で*ObjectFactoryを探すことです。検索結果:

Rendering/OpenGL2/vtkRenderingOpenGL2ObjectFactory.cxx:

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

RegisterOverride("vtkPolyDataMapper"を探すことはさらに有益かもしれません。

どのオブジェクトファクトリが存在しますか?

初期化できる既存のすべてのモジュールのリストを取得するには、_AutoInit_Constructを検索します。 *_AutoInit_Constructは、VTK_MODULE_INITによって呼び出されるメソッドです。

別の方法として、 vtkObjectFactory から派生したすべてのクラスを調べることができます。

2番目の方法は、 RegisterOverride へのすべての呼び出しを探すことです。

詳細情報

私はもともと 重複した質問 に対してこの回答を書いたことに注意してください。しかし、この問題を解決するための一般的な情報は、同じエラーメッセージを持つ他の人々にとって興味深いかもしれません。

3
m7913d

ガイド ここ に従うことをお勧めします。VTK_MODULE_INITマクロが最も信頼性が高く、 ここのガイド 必要な変更の概要を提供します。たとえば、ほとんどの標準オーバーライドを取得するには、vtkRenderingOpenGLにリンクする必要があります。 CMakeを使用する場合、find_packageのCOMPONENTS引数でCMakeを指定すると、CMakeがVTK_LIBRARIESに追加され、VTK_USE_FILEを含めると正しいコンパイラ定義が追加されます。

2

プラットフォームでも同じ問題が発生しました。 Visual Studio 2015 Windows 7 VTK 6.3

Marcus D. Hanwellの投稿から VTK/Build System Migration をフォローしましたが、機能します。私の追加の行は次のとおりです。

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

プリプロセッサの上に。 RestlessC0braの投稿との違いは、おそらくOpenGLバージョンです。

1
Cloud Cho

簡単なハックソリューション: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にパッケージの場所を知らせ、次に2番目のfind_packageは場所を知るvtkRendering $ {VTK_RENDERING_BACKEND}

1
Liu Hao Cheng

ParaViewのCatalystライブラリを使用する場合は、include("${PARAVIEW_USE_FILE}")に加えて以下を追加する必要があります。

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