Не найдено переопределение для 'vtkPolyDataMapper'

Я пытаюсь использовать vtk в своем коде, но у меня проблемы с примером. Я почти не понимаю причин, так как это первый раз, когда я его использую, и я не очень опытен. Я использую visual studio 2012 и платформу 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.

Кто-нибудь знает, как решить эту проблему или, по крайней мере, что означает эта ошибка?

Ответ 1

Я тоже получал эту ошибку. Ошибка означает, что компоновщик не может найти определение для метода vtkPolyDataMapper. Нужно отметить, какой vtk-рендеринг он использовал во время сборки. Вероятно, это будет либо vtkRenderingOpenGL, либо vtkRenderingOpenGL2. Перейдите в свою папку build/lib и найдите один из них. У меня есть сообщество VS 2015 и есть vtkRenderingOpenGL2, с vtk-7.1, построенным на платформе Windows 8.1, x86_64 Platform, Release configuration.

Я исправил проблему, вставив 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)

Ответ 2

В соответствии с руководством по переносу VTK, если вы не используете CMake для компиляции кода, вам нужно добавить несколько #define s. Для VTK 6.0 эти строки должны идти до любых других VTK #include s:

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

Ответ 3

Вам не хватает include(${VTK_USE_FILE}) в вашем файле CMakeLists.txt.

Ответ 4

Я бы порекомендовал следующее руководство здесь, причем макрос VTK_MODULE_INIT является самым надежным, руководство здесь, предоставляя обзор высокого уровня необходимых изменений. Вы должны ссылаться на vtkRenderingOpenGL, например, чтобы получить большинство стандартных переопределений. Если вы используете CMake, то указание его в аргументе COMPONENTS find_package приведет к его добавлению в VTK_LIBRARIES, и в том числе VTK_USE_FILE приведет к добавлению правильных определений компилятора.

Ответ 5

Предполагая, что вы используете OpenGL2, вы должны инициализировать модуль vtkRenderingOpenGL2, гарантируя, что его объект factory зарегистрирован правильно:

VTK_MODULE_INIT(vtkRenderingOpenGL2)

Вы должны вызвать этот макрос в глобальной области (например, main.cpp) как задокументированный в исходном коде:

Инициализировать именованный модуль, гарантируя его объект factoryправильно зарегистрирована и незарегистрирована. Этот вызов должен быть сделан в глобальный объем в блоке перевода вашего исполняемого файла (который может включить общую библиотеку, но не будет работать так, как ожидалось, в статическом библиотека).

#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.

Второй альтернативой является поиск всех вызовов RegisterOverride.

Дополнительная информация

Обратите внимание, что я изначально написал этот ответ для повторяющегося вопроса, но я думаю, что общая информация о решении этой проблемы может представлять интерес для других людей с одинаковой ошибкой сообщение.

Ответ 6

При использовании библиотек ParaView Catalyst вам необходимо добавить следующее в дополнение к include("${PARAVIEW_USE_FILE}"):

set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${VTK_DEFINITIONS})

Ответ 7

Быстрое хакерское решение: в файле 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}.

Ответ 8

У меня была такая же проблема на моей платформе; Visual Studio 2015 Windows 7 VTK 6.3

Я следил за VTK/Build System Migration от должности Маркуса Д. Ханвелла, и он работает. Мои дополнительные линии:

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

в верхней части препроцессора. Отличие от сообщения RestlessC0bra - это, вероятно, версия OpenGL.