2017-03-22 42 views
0

我最近安装了Qt4,即使我已经安装了一些Qt5库,因为应用程序似乎需要Qt4。不幸的是,该应用程序还使用了mayavi,当它试图导入其mlab模块时,它现在会出现段错误。我设法给段错误的原因隔离到下面的进口,这两者都必须使碰撞:我该如何解决一个明显的Qt4/Qt5冲突?

[email protected]:~$ python 
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import vtk 
>>> from pyface import api as pyface 
QMetaType::registerType: Binary compatibility break -- Size mismatch for  type 'QUuid' [30]. Previously registered size 16, now registering size 0. 
Aborted (core dumped) 
[email protected]:~$ 

周围的Googling导致了一些建议,如何在.bashrc设置环境变量:

export QTCHOOSER_RUNTOOL=qtconfig 
export QT_SELECT=4 
export QT_API='pyside' 
export ETS_TOOLKIT='qt4' 

我用过这些,有点盲目,但没有成功。

我正确地认为我的问题是由于冲突造成的,如果是的话,我应该怎么做?

============================================== =============================== 我已经调查了一点。现在我能得到这个崩溃以下两个进口:

[email protected]:~/Downloads/temp3/mne-python$ python 
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from vtk.vtkCommonCore import * 
>>> from PySide.QtGui import * 
QMetaType::registerType: Binary compatibility break -- Size mismatch for type 'QUuid' [30]. Previously registered size 16, now registering size 0. 
Aborted (core dumped) 

vtk.vtkCommonCore包含单行线,其中进口vtkCommonCorePython,这是一个.so文件。

同样,PySide.QtGui也是一个.so文件。

所以,我的下一步是看哪个.so文件/usr/local/lib/python2.7/dist-packages/PySide/QtGui.so/usr/lib/python2.7/dist-packages/vtk/vtkCommonCorePython.x86_64-linux-gnu.so依赖。

我发现是这样的:

[email protected]:/usr/lib/python2.7/dist-packages/vtk$ ldd -v vtkCommonCorePython.x86_64-linux-gnu.so 
    linux-vdso.so.1 => (0x00007fff28fc0000) 
    libvtkCommonCorePython27D-6.2.so.6.2 => /usr/lib/x86_64-linux-gnu/libvtkCommonCorePython27D-6.2.so.6.2 (0x00007f0488925000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f04885a2000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f04881d9000) 
    libvtkWrappingPython27Core-6.2.so.6.2 => /usr/lib/x86_64-linux-gnu/libvtkWrappingPython27Core-6.2.so.6.2 (0x00007f0487fac000) 
    libvtkCommonCore-6.2.so.6.2 => /usr/lib/x86_64-linux-gnu/libvtkCommonCore-6.2.so.6.2 (0x00007f0487a7d000) 
    libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007f04874ef000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f04871e6000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0486fcf000) 
    /lib64/ld-linux-x86-64.so.2 (0x000055b9eee1f000) 
    libvtksys-6.2.so.6.2 => /usr/lib/x86_64-linux-gnu/libvtksys-6.2.so.6.2 (0x00007f0486d8a000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0486b6c000) 
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f0486952000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f048674e000) 
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f048654a000) 

这:

[email protected]:/usr/local/lib/python2.7/dist-packages/PySide$ ldd -v /usr/local/lib/python2.7/dist-packages/PySide/QtGui.so 
    linux-vdso.so.1 => (0x00007fff37bfc000) 
    libpyside-python2.7.so.1.2 (0x00007ff4672cf000) 
    libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007ff466cfa000) 
    libshiboken-python2.7.so.1.2 (0x00007ff466ac6000) 
    libQtGui.so.4 => /usr/lib/x86_64-linux-gnu/libQtGui.so.4 (0x00007ff465dd2000) 
    libQtCore.so.4 => /usr/lib/x86_64-linux-gnu/libQtCore.so.4 (0x00007ff4658de000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff46555c000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff465346000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff464f7c000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff464d5f000) 
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff464b45000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff464940000) 
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007ff46473d000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff464434000) 
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007ff4641f0000) 
    libaudio.so.2 => /usr/lib/x86_64-linux-gnu/libaudio.so.2 (0x00007ff463fd7000) 
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007ff463cc6000) 
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007ff463aa0000) 
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007ff4637f6000) 
    libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007ff4635a3000) 
    libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007ff46339a000) 
    libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007ff463180000) 
    libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007ff462f70000) 
    libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007ff462d65000) 
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007ff462b53000) 
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007ff462819000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff462610000) 
/lib64/ld-linux-x86-64.so.2 (0x000055bd99ece000) 
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007ff4623e7000) 
    libXt.so.6 => /usr/lib/x86_64-linux-gnu/libXt.so.6 (0x00007ff46217d000) 
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007ff461f79000) 
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007ff461d09000) 
    libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007ff461b00000) 
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007ff4618fb000) 
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007ff4616d8000) 
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007ff4614d2000) 

只有/usr/local/lib/python2.7/dist-packages/PySide/QtGui.so似乎已经到了Qt库的任何直接连接,所以我不知道如何/为什么vtk导入干扰任何Qt相关。

最后,我对Qt /usr/lib/x86_64-linux-gnu/libQt...so文件正在使用哪个版本感到好奇。所以,我想这一点:

[email protected]:~$ qmake --version 
QMake version 2.01a 
Using Qt version 4.8.7 in /usr/lib/x86_64-linux-gnu 

我还检查我的版本的vtk

>>> vtk.VTK_MAJOR_VERSION 
6 
>>> vtk.VTK_MINOR_VERSION 
2 
>>> 

,并单独,我的版本PySide的:

>>> import PySide 
>>> PySide.__version__ 
'1.2.4' 

在这一点上,我只有更多的疑惑。我的问题是Qt4/Qt5冲突吗? (我是这么认为的),如果不是,为什么会赛格故障与错误:

QMetaType::registerType: Binary compatibility break -- Size mismatch for  type 'QUuid' [30]. Previously registered size 16, now registering size 0. 
    Aborted (core dumped) 

如果是这样,为什么我只似乎使用Qt的一个版本?最重要的是,我该如何解决这个问题?

回答

0

使用默认的Qt构建配置,给定的过程只能使用一个版本的Qt。如果你正在加载一个使用Qt 5的Python模块,而另一个使用Qt 4,那么会出现大量符号重叠的问题。

要在应用程序中与Qt 5并行使用Qt 4,您必须在其自己的命名空间中编译一个Qt版本,然后重新构建使用该Qt版本的模块。这样符号不会冲突,同一个进程可以使用多个Qt版本。

+0

我试着先卸载(sudo make uninstall),但问题仍然存在。我的机器上还有其他Qt4文件。所以,现在,我有点困惑。我可以通过/ var/lib/dpkg/info来查找在正确的时间安装的任何东西并手动删除它们。但是,我担心可能会给我购买更多的问题,而不是解决问题。... – user1245262

+0

不要卸载任何东西! Qt的设计使多个版本可以共存。安装多个版本是完全正常的,例如在我的开发系统上,我目前有大约20个安装的Qt版本。你也试图绕过包管理器,可能会破坏它的状态:不要这样做。你不是为了! –

+0

在我的回答中,我只是说你应该编译Qt 4通过将'-qtnamespace Qt'传递给'configure'来在它自己的命名空间中。然后建立它。然后使用该版本的Qt构建基于Qt-4的Python模块。然后它不会与其他模块使用的Qt 5冲突。 –