尝试使用 Qt 和 VTK 显示 DICOM 文件时出现未定义的参考问题

Undefined reference issue when trying to display a DICOM file using Qt and VTK

我正在尝试在 Ubuntu 下使用 VTK 7.1 和 Qt 5.5.1 开发一个简单的 DICOM 查看器,尽管在我的终端上尝试编译项目或使用 Creator 时出现了几个未定义的引用错误。 ..

结果:

libDigitalImagingLib.so : undefined reference to 'vtkRenderingVolumeOpenGL2_AutoInit_Construct()'
libDigitalImagingLib.so : undefined reference to 'vtkRenderingVolumeOpenGL2_AutoInit_Construct()'
libDigitalImagingLib.so : undefined reference to 'vtkImageViewer2::New()'

我这个案例的项目相关代码如下所示...

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED (VERSION 2.8)
PROJECT (DigitalImaging)

FIND_PACKAGE (VTK)
INCLUDE (${VTK_USE_FILE})

FIND_PACKAGE (Qt5Widgets)

SET (DigitalImagingLib_src ${PROJECT_SOURCE_DIR}/mainwindow.cpp)
SET (DigitalImagingLib_hdr ${PROJECT_SOURCE_DIR}/mainwindow.h)
SET (DigitalImagingLib_ui ${PROJECT_SOURCE_DIR}/mainwindow.ui)
SET (DigitalImagingBin_src ${PROJECT_SOURCE_DIR}/main.cxx)

qt5_wrap_cpp(DigitalImagingLib_hdr_moc ${DigitalImagingLib_hdr})
qt5_wrap_ui(DigitalImagingLib_ui_moc ${DigitalImagingLib_ui})

include_directories (${PROJECT_SOURCE_DIR})
include_directories (${PROJECT_BINARY_DIR})

add_library (DigitalImagingLib SHARED
    ${DigitalImagingLib_src}
    ${DigitalImagingLib_hdr_moc}
    ${DigitalImagingLib_ui_moc}
)

target_link_libraries (DigitalImagingLib Qt5::Widgets)

ADD_EXECUTABLE(DigitalImaging
    ${DigitalImagingBin_src}
)

TARGET_LINK_LIBRARIES (DigitalImaging
    ${VTK_LIBRARIES}
    DigitalImagingLib
)

mainwindow.cpp :

# include "mainwindow.h"
# include "ui_mainwindow.h"

# include <vtkSmartPointer.h>
# include <vtkImageViewer2.h>
# include <vtkDICOMImageReader.h>
# include <vtkRenderWindow.h>
# include <vtkRenderWindowInteractor.h>
# include <vtkRenderer.h>
# include <QVTKWidget.h>

...

void MainWindow::displayDICOM(std::string file) {
    vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
    reader -> SetFileName(file.c_str());
    reader -> Update();

    vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer -> SetInputConnection(reader -> GetOutputPort());
    imageViewer -> SetRenderWindow(ui -> vtkRenderer -> GetRenderWindow());
    imageViewer -> Render();
}

...

作为初学者,非常感谢有关 CMake 最佳编码实践的任何帮助和提示!也许值得一提的是我尝试实施以下但没有取得任何显着的成功(似乎也是如此)...

# include "vtkAutoInit.h"

VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)

您似乎没有在 DigitalImagingLib 中添加 VTK 库,因为错误来自 libDigitalImagingLib.so

target_link_libraries (DigitalImagingLib Qt5::Widgets ${VTK_LIBRARIES})