尝试使用 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})
我正在尝试在 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})