首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解决明显的Qt4 / Qt5冲突?

如何解决明显的Qt4 / Qt5冲突?
EN

Stack Overflow用户
提问于 2017-03-22 14:57:27
回答 1查看 1.6K关注 0票数 0

我最近安装了Qt4,尽管我已经安装了一些Qt5库,因为应用程序似乎需要Qt4。不幸的是,该应用程序还使用了mayavi,当它试图导入其mlab模块时,该应用程序现在将分割错误。我设法将分段错误的原因隔离到以下导入,这两个导入都是导致崩溃的必要条件:

代码语言:javascript
运行
复制
me@Bedrock:~$ 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)
me@Bedrock:~$ 

谷歌搜索了一些关于如何在.bashrc中设置环境变量的建议:

代码语言:javascript
运行
复制
export QTCHOOSER_RUNTOOL=qtconfig
export QT_SELECT=4
export QT_API='pyside'
export ETS_TOOLKIT='qt4'

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

我是否正确地认为我的问题是由于Qt4/Qt5冲突造成的,如果是的话,我该怎么办?

=============================================================================,我已经进一步研究过了。现在,我可以通过以下两个导入实现这一崩溃:

代码语言:javascript
运行
复制
me@Bedrock:~/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所依赖的。

我发现的是:

代码语言:javascript
运行
复制
me@Bedrock:/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)

这是:

代码语言:javascript
运行
复制
me@Bedrock:/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相关的内容。

最后,我对/usr/lib/x86_64-linux-gnu/libQt...so文件使用的Qt版本感到好奇。所以,我试过这个

代码语言:javascript
运行
复制
me@Bedrock:~$ qmake --version
QMake version 2.01a
Using Qt version 4.8.7 in /usr/lib/x86_64-linux-gnu

我还检查了我的vtk版本

代码语言:javascript
运行
复制
>>> vtk.VTK_MAJOR_VERSION
6
>>> vtk.VTK_MINOR_VERSION
2
>>> 

另外,我的PySide版本:

代码语言:javascript
运行
复制
>>> import PySide
>>> PySide.__version__
'1.2.4'

在这一点上,我只是更困惑。我的问题是Qt4/Qt5冲突吗?(我想是的)如果不是,为什么我会犯错误:

代码语言:javascript
运行
复制
QMetaType::registerType: Binary compatibility break -- Size mismatch for       type 'QUuid' [30]. Previously registered size 16, now registering size 0.
    Aborted (core dumped)

如果是这样,为什么我只使用一个版本的Qt?最重要的是,我怎样才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-22 15:07:54

对于Qt构建的默认配置,给定流程只能使用Qt的一个版本。如果要加载使用Qt 5的Python模块,而另一个使用Qt 4的模块,则会出现大量符号重叠的问题。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42955301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档