I am trying to compile a Qt project that uses ITK but I am receiving linker errors (see below) from the ITK libraries. I am running on Ubuntu 16.04 and building with Qt 5.9.1. I compiled the ITK version 4.12.1 but I have also tried 4.13 as well as a pre-built version of 4.12.2 from a colleague. I have tried compiling with CMake 3.5 and later with CMake 3.10 but I get the same errors for all of these combinations.
I have generated the list of libraries that I include in my Qt project using the command lorder * | tsort
while in the lib
folder of the ITK build. This should generate the correct order of include libraries right?
The compiler is complaining about not finding vnl_vector
, but I checked the list of linked libraries and -litkvnl
as well as -litkvnl_algo
are in there and above -lITKCommon
which seems to be the problem.
Below I have provided the compile errors as well as the .pri file in which I link to the libraries. Any help would be greatly appreciated!
Error message:
//usr/local/lib/libITKCommon-4.12.a(itkMetaDataObject.cxx.o): In function `itk::MetaDataObject<itk::Array<char> >::~MetaDataObject()':
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIcEEED2Ev[_ZN3itk14MetaDataObjectINS_5ArrayIcEEED5Ev]+0x2a): undefined reference to `vnl_vector<char>::~vnl_vector()'
//usr/local/lib/libITKCommon-4.12.a(itkMetaDataObject.cxx.o): In function `itk::MetaDataObject<itk::Array<int> >::~MetaDataObject()':
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIiEEED2Ev[_ZN3itk14MetaDataObjectINS_5ArrayIiEEED5Ev]+0x2a): undefined reference to `vnl_vector<int>::~vnl_vector()'
Makefile:249: recipe for target 'mesh2binary' failed
//usr/local/lib/libITKCommon-4.12.a(itkMetaDataObject.cxx.o): In function `itk::MetaDataObject<itk::Array<float> >::~MetaDataObject()':
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIfEEED2Ev[_ZN3itk14MetaDataObjectINS_5ArrayIfEEED5Ev]+0x2a): undefined reference to `vnl_vector<float>::~vnl_vector()'
//usr/local/lib/libITKCommon-4.12.a(itkMetaDataObject.cxx.o): In function `itk::MetaDataObject<itk::Array<char> >::SetMetaDataObjectValue(itk::Array<char> const&)':
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIcEEE22SetMetaDataObjectValueERKS2_[_ZN3itk14MetaDataObjectINS_5ArrayIcEEE22SetMetaDataObjectValueERKS2_]+0x26): undefined reference to `vnl_vector<char>::set_size(unsigned long)'
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIcEEE22SetMetaDataObjectValueERKS2_[_ZN3itk14MetaDataObjectINS_5ArrayIcEEE22SetMetaDataObjectValueERKS2_]+0x39): undefined reference to `vnl_vector<char>::operator=(vnl_vector<char> const&)'
//usr/local/lib/libITKCommon-4.12.a(itkMetaDataObject.cxx.o): In function `itk::MetaDataObject<itk::Array<int> >::SetMetaDataObjectValue(itk::Array<int> const&)':
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIiEEE22SetMetaDataObjectValueERKS2_[_ZN3itk14MetaDataObjectINS_5ArrayIiEEE22SetMetaDataObjectValueERKS2_]+0x26): undefined reference to `vnl_vector<int>::set_size(unsigned long)'
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIiEEE22SetMetaDataObjectValueERKS2_[_ZN3itk14MetaDataObjectINS_5ArrayIiEEE22SetMetaDataObjectValueERKS2_]+0x39): undefined reference to `vnl_vector<int>::operator=(vnl_vector<int> const&)'
//usr/local/lib/libITKCommon-4.12.a(itkMetaDataObject.cxx.o): In function `itk::MetaDataObject<itk::Array<float> >::SetMetaDataObjectValue(itk::Array<float> const&)':
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIfEEE22SetMetaDataObjectValueERKS2_[_ZN3itk14MetaDataObjectINS_5ArrayIfEEE22SetMetaDataObjectValueERKS2_]+0x26): undefined reference to `vnl_vector<float>::set_size(unsigned long)'
itkMetaDataObject.cxx:(.text._ZN3itk14MetaDataObjectINS_5ArrayIfEEE22SetMetaDataObjectValueERKS2_[_ZN3itk14MetaDataObjectINS_5ArrayIfEEE22SetMetaDataObjectValueERKS2_]+0x39): undefined reference to `vnl_vector<float>::operator=(vnl_vector<float> const&)'
collect2: error: ld returned 1 exit status
make: *** [mesh2binary] Error 1
11:24:11: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project mesh2binary (kit: Desktop Qt 5.9.1 GCC 64bit2)
When executing step "Make"
.pri file which I include in my .pro file:
ITKDIR=/usr/local/ITK/InsightToolkit-4.12.1-Release/include/ITK-4.12
ITKLIB=/usr/local/ITK/InsightToolkit-4.12.1-Release/build/lib
VERSIONNUMBER=4.12
#Include ITK Headers
INCLUDEPATH += $${ITKDIR}
# ITK Libs
LIBS += -L$${ITKLIB} -lITKBiasCorrection-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKBioCell-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKDICOMParser-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKFEM-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOBMP-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOBioRad-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOCSV-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOGDCM-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOGE-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOGIPL-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOHDF5-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOJPEG-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOLSM-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOMRC-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOMesh-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOMeta-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIONIFTI-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIONRRD-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOPNG-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOSiemens-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOSpatialObjects-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOStimulate-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOTransformBase-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOTransformHDF5-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOTransformInsightLegacy-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOTransformMatlab-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOVTK-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKKLMRegionGrowing-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKLabelMap-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKMesh-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKOptimizers-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKOptimizersv4-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKPath-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKPolynomials-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKQuadEdgeMesh-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKSpatialObjects-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKStatistics-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKTransform-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKVNLInstantiation-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKVTK-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKVideoCore-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKVideoIO-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKWatersheds-$${VERSIONNUMBER}
#LIBS += -L$${ITKLIB} -lhdf5
LIBS += -L$${ITKLIB} -litkgdcmMEXD-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litknetlib-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litktestlib-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOTIFF-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKgiftiio-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKMetaIO-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKNrrdIO-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkpng-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOIPL-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOXML-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKTransformFactory-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkhdf5_cpp
LIBS += -L$${ITKLIB} -litkNetlibSlatec-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkvnl_algo-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmMSFF-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmsocketxx-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litktiff-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKniftiio-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKIOImageBase-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkhdf5
LIBS += -L$${ITKLIB} -litkvnl-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkv3p_netlib-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmDICT-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmcharls-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmuuid-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmopenjpeg-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmjpeg8-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmjpeg16-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmjpeg12-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkjpeg-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKznz-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKCommon-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkvcl-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmIOD-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litksys-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkdouble-conversion-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmDSED-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -lITKEXPAT-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkgdcmCommon-$${VERSIONNUMBER}
LIBS += -L$${ITKLIB} -litkzlib-$${VERSIONNUMBER}
I would suggest you to convert your project's build system into CMake. I do not advice build ITK with any other system than CMake. Since 2.8.10 it is quite stable, and if you even have a current version, there should be no problems.
Your CMakeLists.txt file would probably look similiar to this:
cmake_minimum_required(VERSION 3.1)
set (CMAKE_CXX_STANDARD 11)
project(HelloWorldItkQt)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc and uic automatically when needed.
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
# Find the Qt libraries
find_package(Qt5Gui)
find_package(Qt5Widgets)
find_package(Qt5Core)
#find and enable ITK
find_package(ITK)
include(${ITK_USE_FILE})
# Tell CMake to create the helloworld executable
add_executable(HelloWorldItkQt WIN32 mainwindow.h simpledialog.h mainwindow.cpp simpledialog.cpp main.cpp)
# Use the Widgets module from Qt 5.
target_link_libraries(HelloWorldItkQt Qt5::Widgets Qt5::Gui Qt5::Core ${ITK_LIBRARIES})
Here you will find some more information: