我有一个使用VTK和Qt 5的应用程序。在运行时,我得到以下backtrace
#0 0x00007fffec00a66b in raise () at /lib64/libc.so.6
#1 0x00007fffec00c381 in abort () at /lib64/libc.so.6
#2 0x00007fffec054a57 in __libc_message () at /lib64/libc.so.6
#3 0x00007fffec05b9aa in () at /lib64/libc.so.6
#4 0x00007fffec06490a in realloc () at /lib64/libc.so.6
#5 0x00007fffed5c6661 in QListData::realloc_grow(int) () at /lib64/libQt5Core.so.5
#6 0x00007fffed5c66ff in QListData::append(int) () at /lib64/libQt5Core.so.5
#7 0x00007fffed6856c0 in QList<QResourceRoot*>::append(QResourceRoot* const&) () at /lib64/libQt5Core.so.5
#8 0x00007fffed6814cd in qRegisterResourceData(int, unsigned char const*, unsigned char const*, unsigned char const*) () at /lib64/libQt5Core.so.5
#9 0x00007fffed558563 in _GLOBAL__sub_I_qrc_mimetypes.cpp () at /lib64/libQt5Core.so.5
#10 0x00007ffff7de5c13 in _dl_init () at /lib64/ld-linux-x86-64.so.2
#11 0x00007ffff7dd5f0a in _dl_start_user () at /lib64/ld-linux-x86-64.so.2
#12 0x0000000000000001 in ()
#13 0x00007fffffffdf5f in ()
#14 0x0000000000000000 in ()
看起来QT 4和5之间存在一些不匹配导致库初始化错误。所以我检查了lddtree
输出
simulator-ui => ./simulator-ui (interpreter => /lib64/ld-linux-x86-64.so.2)
libvtkGUISupportQt.so.1 => /usr/lib64/vtk/libvtkGUISupportQt.so.1
libvtkInteractionStyle.so.1 => /usr/lib64/vtk/libvtkInteractionStyle.so.1
libvtkRenderingOpenGL2.so.1 => /usr/lib64/vtk/libvtkRenderingOpenGL2.so.1
libOSMesa.so.8 => /lib64/libOSMesa.so.8
libglapi.so.0 => /lib64/libglapi.so.0
libselinux.so.1 => /lib64/libselinux.so.1
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0
ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2
libLLVM-5.0.so => /lib64/libLLVM-5.0.so
libffi.so.6 => /lib64/../lib64/libffi.so.6
libedit.so.0 => /lib64/../lib64/libedit.so.0
libncurses.so.6 => /lib64/libncurses.so.6
libtinfo.so.6 => /lib64/../lib64/libtinfo.so.6
libGLU.so.1 => /lib64/libGLU.so.1
libGL.so.1 => /lib64/libGL.so.1
libGLX.so.0 => /lib64/libGLX.so.0
libGLdispatch.so.0 => /lib64/libGLdispatch.so.0
libz.so.1 => /lib64/libz.so.1
libjpeg.so.62 => /lib64/libjpeg.so.62
libpng16.so.16 => /lib64/libpng16.so.16
libtiff.so.5 => /lib64/libtiff.so.5
libjbig.so.2.1 => /lib64/libjbig.so.2.1
libvtkglew.so.1 => /usr/lib64/vtk/libvtkglew.so.1
libvtkIOImport.so.1 => /usr/lib64/vtk/libvtkIOImport.so.1
libQt5Svg.so.5 => /lib64/libQt5Svg.so.5
libQt5Charts.so.5 => /lib64/libQt5Charts.so.5
libmathematica++.so => /home/sensiaas/projects/senschedule/build/mathematica++/libmathematica++.so
libboost_filesystem.so.1.64.0 => /lib64/libboost_filesystem.so.1.64.0
libboost_system.so.1.64.0 => /lib64/libboost_system.so.1.64.0
libboost_serialization.so.1.64.0 => /lib64/libboost_serialization.so.1.64.0
libvtkFiltersExtraction.so.1 => /usr/lib64/vtk/libvtkFiltersExtraction.so.1
libvtkFiltersStatistics.so.1 => /usr/lib64/vtk/libvtkFiltersStatistics.so.1
libvtkImagingFourier.so.1 => /usr/lib64/vtk/libvtkImagingFourier.so.1
libvtkalglib.so.1 => /usr/lib64/vtk/libvtkalglib.so.1
libvtkImagingCore.so.1 => /usr/lib64/vtk/libvtkImagingCore.so.1
libSM.so.6 => /lib64/libSM.so.6
libICE.so.6 => /lib64/libICE.so.6
libX11.so.6 => /lib64/libX11.so.6
libxcb.so.1 => /lib64/libxcb.so.1
libXau.so.6 => /lib64/libXau.so.6
libXext.so.6 => /lib64/libXext.so.6
libXt.so.6 => /lib64/libXt.so.6
* libQtGui.so.4 => /lib64/libQtGui.so.4
libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0
libpcre.so.1 => /lib64/libpcre.so.1
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0
libfreetype.so.6 => /lib64/libfreetype.so.6
libbz2.so.1 => /lib64/libbz2.so.1
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0
libXi.so.6 => /lib64/libXi.so.6
libXrender.so.1 => /lib64/libXrender.so.1
libXrandr.so.2 => /lib64/libXrandr.so.2
libXfixes.so.3 => /lib64/libXfixes.so.3
libXcursor.so.1 => /lib64/libXcursor.so.1
libXinerama.so.1 => /lib64/libXinerama.so.1
libfontconfig.so.1 => /lib64/libfontconfig.so.1
libexpat.so.1 => /lib64/libexpat.so.1
* libQtNetwork.so.4 => /lib64/libQtNetwork.so.4
libssl.so.10 => /lib64/libssl.so.10
libcrypto.so.10 => /lib64/libcrypto.so.10
* libQtCore.so.4 => /lib64/libQtCore.so.4
libvtkRenderingCore.so.1 => /usr/lib64/vtk/libvtkRenderingCore.so.1
libvtkFiltersSources.so.1 => /usr/lib64/vtk/libvtkFiltersSources.so.1
libvtkFiltersGeneral.so.1 => /usr/lib64/vtk/libvtkFiltersGeneral.so.1
libvtkCommonComputationalGeometry.so.1 => /usr/lib64/vtk/libvtkCommonComputationalGeometry.so.1
libvtkCommonColor.so.1 => /usr/lib64/vtk/libvtkCommonColor.so.1
libvtkFiltersGeometry.so.1 => /usr/lib64/vtk/libvtkFiltersGeometry.so.1
libvtkFiltersCore.so.1 => /usr/lib64/vtk/libvtkFiltersCore.so.1
libvtkIOImage.so.1 => /usr/lib64/vtk/libvtkIOImage.so.1
libvtkCommonExecutionModel.so.1 => /usr/lib64/vtk/libvtkCommonExecutionModel.so.1
libvtkCommonDataModel.so.1 => /usr/lib64/vtk/libvtkCommonDataModel.so.1
libvtkCommonTransforms.so.1 => /usr/lib64/vtk/libvtkCommonTransforms.so.1
libvtkCommonMisc.so.1 => /usr/lib64/vtk/libvtkCommonMisc.so.1
libvtkCommonMath.so.1 => /usr/lib64/vtk/libvtkCommonMath.so.1
libvtkCommonSystem.so.1 => /usr/lib64/vtk/libvtkCommonSystem.so.1
libvtkCommonCore.so.1 => /usr/lib64/vtk/libvtkCommonCore.so.1
libvtksys.so.1 => /usr/lib64/vtk/libvtksys.so.1
libvtkDICOMParser.so.1 => /usr/lib64/vtk/libvtkDICOMParser.so.1
libvtkmetaio.so.1 => /usr/lib64/vtk/libvtkmetaio.so.1
libQt5Widgets.so.5 => /lib64/libQt5Widgets.so.5
libQt5Gui.so.5 => /lib64/libQt5Gui.so.5
libharfbuzz.so.0 => /lib64/libharfbuzz.so.0
libgraphite2.so.3 => /lib64/libgraphite2.so.3
libQt5Core.so.5 => /lib64/libQt5Core.so.5
libsystemd.so.0 => /lib64/libsystemd.so.0
libgcrypt.so.20 => /lib64/libgcrypt.so.20
libgpg-error.so.0 => /lib64/libgpg-error.so.0
liblzma.so.5 => /lib64/liblzma.so.5
liblz4.so.1 => /lib64/liblz4.so.1
libicui18n.so.57 => /lib64/libicui18n.so.57
libicuuc.so.57 => /lib64/libicuuc.so.57
libicudata.so.57 => /lib64/libicudata.so.57
libpcre2-16.so.0 => /lib64/libpcre2-16.so.0
libstdc++.so.6 => /lib64/libstdc++.so.6
libpthread.so.0 => /lib64/libpthread.so.0
librt.so.1 => /lib64/librt.so.1
libdl.so.2 => /lib64/libdl.so.2
libuuid.so.1 => /lib64/libuuid.so.1
libm.so.6 => /lib64/libm.so.6
libgcc_s.so.1 => /lib64/libgcc_s.so.1
libc.so.6 => /lib64/libc.so.6
它显示Qt4
依赖项以及Qt5
依赖项。然后我检查了Qt
的{{1}}依赖项。这表明它仅取决于libvtkGUISupportQt.so
。
Qt4
在vtk mailing list他们说将变量$ ldd /usr/lib64/vtk/libvtkGUISupportQt.so.1 | grep -i qt
libQtGui.so.4 => /lib64/libQtGui.so.4 (0x00007f153b7bd000)
libQtNetwork.so.4 => /lib64/libQtNetwork.so.4 (0x00007f153b46f000)
libQtCore.so.4 => /lib64/libQtCore.so.4 (0x00007f153af6b000)
设置为VTK_QT_VERSION
应该有效。但我怀疑,因为"5"
依赖于libvtkGUISupportQt.so
编译。但是我在Qt4
中设置了该变量。正如所料,它没有用。
CMakeLists.txt
那么现在解决方案是什么?我曾经听过VTK 7链接到Qt5。那是错的吗?然而,在我的Mac中它甚至在3个月之前也能正常工作。现在,我的Mac使用set(VTK_QT_VERSION "5" CACHE STRING "Expected Qt version")
mark_as_advanced(VTK_QT_VERSION)
FIND_PACKAGE(VTK 7.0 REQUIRED COMPONENTS vtkGUISupportQt vtkIOImport)
message(STATUS ${VTK_MODULES_DIR})
INCLUDE(${VTK_USE_FILE})
# Find the QtWidgets library
FIND_PACKAGE(Qt5 COMPONENTS Core Widgets Svg Charts REQUIRED)
Vtk 8
(默认值)。几个月前可能是Qt5
Vtk 7
。我不知道,因为我最近做了一些更新。
我更喜欢用Qt5
进行安装,以便我可以轻松发货。 dnf
和Vtk
都安装了Qt
(在Fedora中)和dnf
(在Mac中)但是如果我现在从源代码编译和安装Vtk8会发生冲突吗?
另一个棘手的解决方案可能是绕过brew
并创建一个与QVTKWidget
完成相同工作的QWidget
。如果这很容易。我不知道那是多么可行。
相关Bug报告
使用Qt5构建QVTKWidget
时,可能存在其他依赖项的问题(我不知道,可能是python 3)。但到目前为止Vtk
可以用Qt5编译。所以我认为二进制发行版中可以包含libvtkGUISupportQt
和libvtkGUISupportQt4
。第一个可以用于尚未处理的依赖包。