2017-03-22 84 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衝突。 –