コードで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.
誰かがこの問題を解決する方法を知っていますか、または少なくともこのエラーはどういう意味ですか?
私もこのエラーが発生していました。このエラーは、リンカが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)
VTK移行ガイド によると、CMakeを使用してコードをコンパイルしていない場合は、いくつかの#define
を追加する必要があります。 VTK 6.0の場合、これらの行は他のVTK #include
sの前に移動する必要があります。
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
CMakeLists.txtファイルにinclude(${VTK_USE_FILE})
がありません。
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
へのすべての呼び出しを探すことです。
詳細情報
include(${VTK_USE_FILE})
を呼び出してcmakeを使用して手動でVTK_MODULE_INIT
を呼び出す必要はありませんCMakeLists.txt
で私はもともと 重複した質問 に対してこの回答を書いたことに注意してください。しかし、この問題を解決するための一般的な情報は、同じエラーメッセージを持つ他の人々にとって興味深いかもしれません。
プラットフォームでも同じ問題が発生しました。 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バージョンです。
簡単なハックソリューション: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}。
ParaViewのCatalystライブラリを使用する場合は、include("${PARAVIEW_USE_FILE}")
に加えて以下を追加する必要があります。
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${VTK_DEFINITIONS})