Undefined references when attempting to link against static build of VTK when using qmake

I am attempting to statically link against VTK while using qmake. I understand that this use case has next to zero support, but I’ve gotten it to work when using shared libraries, so I imagine I can’t be too far off from getting static linkage to work.

All of this is being attempted with Qt 5.12.4 and 64-bit MinGW 7.3. I’m also using Qt Creator, if that makes any difference.

As a little bit of background, I’m attempting to add VTK to an existing application that is pretty hopelessly committed to qmake. I know CMake is the foremost (and probably only) build system for VTK, and is probably the better one out of the two, but that ship has already sailed. As mentioned above, I’ve managed to get it working with shared libraries; it’s not exactly pretty, but everything is hidden behind a .pri file and a header that calls the VTK_MODULE_INIT macros appropriately. The .pri file handling this is as follows:

Project include
LIBS += -L"$$PWD/../lib"
INCLUDEPATH += "$$PWD/../include/vtk-8.2" \
    $$PWD/../include/vtk-8.2/vtkdoubleconversion \
    $$PWD/../include/vtk-8.2/vtkeigen \
    $$PWD/../include/vtk-8.2/vtkexodusII \
    $$PWD/../include/vtk-8.2/vtkexpat \
    $$PWD/../include/vtk-8.2/vtkfreetype \
    $$PWD/../include/vtk-8.2/vtkgl2ps \
    $$PWD/../include/vtk-8.2/vtkglew \
    $$PWD/../include/vtk-8.2/vtkhdf5 \
    $$PWD/../include/vtk-8.2/vtkjpeg \
    $$PWD/../include/vtk-8.2/vtkjsoncpp \
    $$PWD/../include/vtk-8.2/vtkkwiml \
    $$PWD/../include/vtk-8.2/vtklibharu \
    $$PWD/../include/vtk-8.2/vtklibproj \
    $$PWD/../include/vtk-8.2/vtklibxml2 \
    $$PWD/../include/vtk-8.2/vtklz4 \
    $$PWD/../include/vtk-8.2/vtklzma \
    $$PWD/../include/vtk-8.2/vtkmetaio \
    $$PWD/../include/vtk-8.2/vtknetcdf \
    $$PWD/../include/vtk-8.2/vtkogg \
    $$PWD/../include/vtk-8.2/vtkpng \
    $$PWD/../include/vtk-8.2/vtkpugixml \
    $$PWD/../include/vtk-8.2/vtksqlite \
    $$PWD/../include/vtk-8.2/vtksys \
    $$PWD/../include/vtk-8.2/vtktheora \
    $$PWD/../include/vtk-8.2/vtktiff \
    $$PWD/../include/vtk-8.2/vtkverdict \
    $$PWD/../include/vtk-8.2/vtkzlib \
    $$PWD/../include/vtk-8.2/vtkdoubleconversion/double-conversion \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Cholesky \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/CholmodSupport \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Eigenvalues \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Geometry \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Householder \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/IterativeLinearSolvers \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Jacobi \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/LU \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/MetisSupport \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/misc \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/OrderingMethods \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/PardisoSupport \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/PaStiXSupport \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/plugins \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/QR \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/SparseCholesky \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/SparseCore \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/SparseLU \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/SparseQR \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/SPQRSupport \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/StlSupport \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/SuperLUSupport \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/SVD \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/UmfPackSupport \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/functors \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/products \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/util \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch/AltiVec \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch/AVX \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch/AVX512 \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch/CUDA \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch/Default \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch/NEON \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch/SSE \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Core/arch/ZVector \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/Geometry/arch \
    $$PWD/../include/vtk-8.2/vtkeigen/eigen/src/LU/arch \
    $$PWD/../include/vtk-8.2/vtkexodusII/include \
    $$PWD/../include/vtk-8.2/vtkexpat/lib \
    $$PWD/../include/vtk-8.2/vtkfreetype/include \
    $$PWD/../include/vtk-8.2/vtkfreetype/include/freetype \
    $$PWD/../include/vtk-8.2/vtkfreetype/include/freetype/config \
    $$PWD/../include/vtk-8.2/vtkglew/include \
    $$PWD/../include/vtk-8.2/vtkglew/include/GL \
    $$PWD/../include/vtk-8.2/vtkhdf5/hl \
    $$PWD/../include/vtk-8.2/vtkhdf5/src \
    $$PWD/../include/vtk-8.2/vtkhdf5/hl/src \
    $$PWD/../include/vtk-8.2/vtkjsoncpp/json \
    $$PWD/../include/vtk-8.2/vtklibharu/include \
    $$PWD/../include/vtk-8.2/vtklibproj/src \
    $$PWD/../include/vtk-8.2/vtklibxml2/libxml \
    $$PWD/../include/vtk-8.2/vtklz4/lib \
    $$PWD/../include/vtk-8.2/vtklzma/src \
    $$PWD/../include/vtk-8.2/vtklzma/src/liblzma \
    $$PWD/../include/vtk-8.2/vtklzma/src/liblzma/api \
    $$PWD/../include/vtk-8.2/vtklzma/src/liblzma/api/lzma \
    $$PWD/../include/vtk-8.2/vtknetcdf/include \
    $$PWD/../include/vtk-8.2/vtkogg/include \
    $$PWD/../include/vtk-8.2/vtkogg/include/ogg \
    $$PWD/../include/vtk-8.2/vtkpugixml/src \
    $$PWD/../include/vtk-8.2/vtktheora/include \
    $$PWD/../include/vtk-8.2/vtktheora/include/theora \
    $$PWD/../include/vtk-8.2/vtktiff/libtiff

INCLUDEPATH += $$PWD
HEADERS += $$PWD/vtk_init.h

LIBS += \
    -lvtksys-8.2                        \
    -lvtkfreetype-8.2                   \
    -lvtkexpat-8.2                      \
    -lvtkzlib-8.2                       \
    -lvtkChartsCore-8.2                 \
    -lvtkCommonColor-8.2                \
    -lvtkCommonComputationalGeometry-8.2\
    -lvtkCommonCore-8.2                 \
    -lvtkCommonDataModel-8.2            \
    -lvtkCommonExecutionModel-8.2       \
    -lvtkCommonMath-8.2                 \
    -lvtkCommonMisc-8.2                 \
    -lvtkCommonSystem-8.2               \
    -lvtkCommonTransforms-8.2           \
    -lvtkDICOMParser-8.2                \
    -lvtkDomainsChemistry-8.2           \
    -lvtkDomainsChemistryOpenGL2-8.2    \
    -lvtkdoubleconversion-8.2           \
    -lvtkexodusII-8.2                   \
    -lvtkFiltersAMR-8.2                 \
    -lvtkFiltersCore-8.2                \
    -lvtkFiltersExtraction-8.2          \
    -lvtkFiltersFlowPaths-8.2           \
    -lvtkFiltersGeneral-8.2             \
    -lvtkFiltersGeneric-8.2             \
    -lvtkFiltersGeometry-8.2            \
    -lvtkFiltersHybrid-8.2              \
    -lvtkFiltersHyperTree-8.2           \
    -lvtkFiltersImaging-8.2             \
    -lvtkFiltersModeling-8.2            \
    -lvtkFiltersParallel-8.2            \
    -lvtkFiltersParallelImaging-8.2     \
    -lvtkFiltersPoints-8.2              \
    -lvtkFiltersProgrammable-8.2        \
    -lvtkFiltersSelection-8.2           \
    -lvtkFiltersSMP-8.2                 \
    -lvtkFiltersSources-8.2             \
    -lvtkFiltersStatistics-8.2          \
    -lvtkFiltersTexture-8.2             \
    -lvtkFiltersTopology-8.2            \
    -lvtkFiltersVerdict-8.2             \
    -lvtkGeovisCore-8.2                 \
    -lvtkgl2ps-8.2                      \
    -lvtkglew-8.2                       \
    -lvtkGUISupportQt-8.2               \
    -lvtkGUISupportQtSQL-8.2            \
    -lvtkhdf5-8.2                       \
    -lvtkhdf5_hl-8.2                    \
    -lvtkImagingColor-8.2               \
    -lvtkImagingCore-8.2                \
    -lvtkImagingFourier-8.2             \
    -lvtkImagingGeneral-8.2             \
    -lvtkImagingHybrid-8.2              \
    -lvtkImagingMath-8.2                \
    -lvtkImagingMorphological-8.2       \
    -lvtkImagingSources-8.2             \
    -lvtkImagingStatistics-8.2          \
    -lvtkImagingStencil-8.2             \
    -lvtkInfovisCore-8.2                \
    -lvtkInfovisLayout-8.2              \
    -lvtkInteractionImage-8.2           \
    -lvtkInteractionStyle-8.2           \
    -lvtkInteractionWidgets-8.2         \
    -lvtkIOAMR-8.2                      \
    -lvtkIOAsynchronous-8.2             \
    -lvtkIOCityGML-8.2                  \
    -lvtkIOCore-8.2                     \
    -lvtkIOEnSight-8.2                  \
    -lvtkIOExodus-8.2                   \
    -lvtkIOExport-8.2                   \
    -lvtkIOExportOpenGL2-8.2            \
    -lvtkIOExportPDF-8.2                \
    -lvtkIOGeometry-8.2                 \
    -lvtkIOImage-8.2                    \
    -lvtkIOImport-8.2                   \
    -lvtkIOInfovis-8.2                  \
    -lvtkIOLegacy-8.2                   \
    -lvtkIOLSDyna-8.2                   \
    -lvtkIOMINC-8.2                     \
    -lvtkIOMovie-8.2                    \
    -lvtkIONetCDF-8.2                   \
    -lvtkIOParallel-8.2                 \
    -lvtkIOParallelXML-8.2              \
    -lvtkIOPLY-8.2                      \
    -lvtkIOSegY-8.2                     \
    -lvtkIOSQL-8.2                      \
    -lvtkIOTecplotTable-8.2             \
    -lvtkIOVeraOut-8.2                  \
    -lvtkIOVideo-8.2                    \
    -lvtkIOXML-8.2                      \
    -lvtkIOXMLParser-8.2                \
    -lvtkjpeg-8.2                       \
    -lvtkjsoncpp-8.2                    \
    -lvtklibharu-8.2                    \
    -lvtklibxml2-8.2                    \
    -lvtklz4-8.2                        \
    -lvtklzma-8.2                       \
    -lvtkmetaio-8.2                     \
    -lvtkNetCDF-8.2                     \
    -lvtkogg-8.2                        \
    -lvtkParallelCore-8.2               \
    -lvtkpng-8.2                        \
    -lvtkproj-8.2                       \
    -lvtkpugixml-8.2                    \
    -lvtkRenderingAnnotation-8.2        \
    -lvtkRenderingContext2D-8.2         \
    -lvtkRenderingContextOpenGL2-8.2    \
    -lvtkRenderingCore-8.2              \
    -lvtkRenderingFreeType-8.2          \
    -lvtkRenderingGL2PSOpenGL2-8.2      \
    -lvtkRenderingImage-8.2             \
    -lvtkRenderingLabel-8.2             \
    -lvtkRenderingLOD-8.2               \
    -lvtkRenderingOpenGL2-8.2           \
    -lvtkRenderingQt-8.2                \
    -lvtkRenderingVolume-8.2            \
    -lvtkRenderingVolumeOpenGL2-8.2     \
    -lvtksqlite-8.2                     \
    -lvtktheora-8.2                     \
    -lvtktiff-8.2                       \
    -lvtkverdict-8.2                    \
    -lvtkViewsContext2D-8.2             \
    -lvtkViewsCore-8.2                  \
    -lvtkViewsInfovis-8.2               \
    -lvtkViewsQt-8.2

According to clang (which Qt Creator uses for highlighting), everything checks out, and I have no syntax errors. The above .pri (with some changes concerning the location of the libraries in the dynamic build) works when using dynamic linkage. However, when attempting to link against a static build of VTK, I receive multiple undefined reference errors.

The mess of include directories was added after looking at this thread, but didn’t make a difference. I suspect that I have the order of linkage wrong, but I have no idea how to find what order CMake would link the libraries in. Is there any way to know the order in which CMake would link against the libraries? Is there something else that I’m missing that would cause undefined reference problems?

Thank you for your time,
Thomas Meier