0
votes

I have a problem subclassing a VTK class, but I think the problem could be linked to any kind of library.

I did a vtkInteractorStyleImage subclass, just overriding a method:

#ifndef dcmInteractorStyleImage_h
#define dcmInteractorStyleImage_h

#include "vtkInteractionStyleModule.h" // For export macro
#include "vtkInteractorStyleImage.h"

class VTKINTERACTIONSTYLE_EXPORT dcmInteractorStyle : public vtkInteractorStyleImage
{
public:
    static dcmInteractorStyle *New();
    vtkTypeMacro(dcmInteractorStyle, vtkInteractorStyleImage);

    virtual void OnLeftButtonDown();

    void PrintSelf(ostream& os, vtkIndent indent);
};    

#endif

The thing is I use it in a Qt class. So I include this in my CMakeLists.txt (simplified):

set(GENERIC_VIEW_CPP
     View/UI/dcminteractorstyle.cpp   # my new class
)

SET(GENERIC_VIEW_H
     View/UI/dcminteractorstyle.h     # my new class
)

add_library(generic ${GENERIC_VIEW_CPP} ${GENERIC_VIEW_H})
...
add_library(ui_qt ${UI_QT_CXX}
     ${UI_FORM_HEADERS} ${UI_RESOURCES_RCC}
     ${MODEL_WRAPPED_HEADERS}
     ${GENERIC_VIEW_CPP} ${GENERIC_VIEW_H} #necesary here?
)
qt5_use_modules(ui_qt Core Gui Widgets)
----------------------------------------------------------

# VTK
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

# ITK
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})
if (ITKVtkGlue_LOADED)
  find_package(VTK REQUIRED)
  include(${VTK_USE_FILE})
else()
  find_package(ItkVtkGlue REQUIRED)
  include(${ItkVtkGlue_USE_FILE})
  set(Glue ItkVtkGlue)
endif()

------------------------------------------------
set_source_files_properties(${UI_RESOURCES_RCC} PROPERTIES GENERATED ON)
add_executable(UtilidadDICOM WIN32 main.cpp ${UI_RESOURCES_RCC})
target_link_libraries(UtilidadDICOM
    model
    ui_qt
    generic
    ${Glue}
    ${VTK_LIBRARIES}
    ${ITK_LIBRARIES}
)

The error trying to compile:

ui_qt.lib(viewerwidget.cpp.obj):-1: error: LNK2019: unresolved external symbol "public: static class dcmInteractorStyle * __cdecl dcmInteractorStyle::New(void)" (?New@dcmInteractorStyle@@SAPAV1@XZ) referenced in function "public: static class vtkSmartPointer __cdecl vtkSmartPointer::New(void)" (?New@?$vtkSmartPointer@VdcmInteractorStyle@@@@SA?AV1@XZ)

ui_qt is a library declared in CMake, as you can see above.

Any ideas? Thank you.

1
Did u figure this out? I am having a similar issueMac

1 Answers

0
votes

Short answer is that your class is not being linked. Try seeing the value in generic just before linking it to your executable. Do a message just before target_link_libraries:

MESSAGE(${generic})

and see if the generic.lib is actually being linked.