Не найдено переопределение для '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.