我使用位于~/opt/qt-4.6.0/
的我自己的Qt4库编译了一个Python模块,
但是当我尝试导入该模块时,加载的动态库来自我的MacPorts Qt4安装。
$ /opt/local/bin/python2.6
>>> import vtk
objc[58041]: Class QMacSoundDelegate is implemented in both /Users/luis/opt/qt-4.6.0/lib/QtGui.framework/Versions/4/QtGui and /opt/local/libexec/qt4-mac/lib/QtGui.framework/Versions/4/QtGui. Using implementation from /opt/local/libexec/qt4-mac/lib/QtGui.framework/Versions/4/QtGui.
objc[58045]: Class QCocoaColorPanelDelegate is implemented in both /Users/luis/opt/qt-4.6.0/lib/QtGui.framework/Versions/4/QtGui and /opt/local/libexec/qt4-mac/lib/QtGui.framework/Versions/4/QtGui. Using implementation from /opt/local/libexec/qt4-mac/lib/QtGui.framework/Versions/4/QtGui.
[... more output like above ...]
>>>
有没有办法告诉Python(也是从MacPorts安装)加载位于我的~/opt/qt-4.6.0/lib/
目录中的框架?我不确定要更改的环境变量。
答案 0 :(得分:2)
尝试设置DYLD_LIBRARY_PATH
以便在调用python之前将库放在~/opt/qt/...
之前的MacPorts库中(请查看~/.profile
,了解如何执行此操作的示例不知道; MacPorts将其库放在DYLD_LIBRARY_PATH
上完全相同。 dyld
,OS X动态链接器使用DYLD_LIBRARY_PATH
在加载时查找库(以及其他方法);有关详细信息,请参阅man dyld
。
答案 1 :(得分:2)
好吧,在Barry Wark向我指出dyld(1)
后,手册页描述了我可以设置的一些变量。
第一个提示来自设置环境变量DYLD_PRINT_LIBRARIES
,因此我可以看到正在加载的库。
$ DYLD_PRINT_LIBRARIES=1 python -c 'import vtk'
[... snip ...]
dyld: loaded: /opt/local/libexec/qt4-mac/lib/QtGui.framework/Versions/4/QtGui
dyld: loaded: /opt/local/lib/libpng12.0.dylib
dyld: loaded: /opt/local/libexec/qt4-mac/lib/QtSql.framework/Versions/4/QtSql
dyld: loaded: /opt/local/libexec/qt4-mac/lib/QtCore.framework/Versions/4/QtCore
[... snip ...]
dyld: loaded: /Users/luis/opt/qt-4.6.0/lib/QtGui.framework/Versions/4/QtGui
dyld: loaded: /Users/luis/opt/qt-4.6.0/lib/QtSql.framework/Versions/4/QtSql
dyld: loaded: /Users/luis/opt/qt-4.6.0/lib/QtCore.framework/Versions/4/QtCore
[... snip ...]
$
啊,所以qt4-mac的框架确实首先被加载,就像我们怀疑的那样。重读手册页,接下来我们可以尝试更改DYLD_FRAMEWORK_PATH
以便它知道在哪里查看。我现在将此行添加到~/.bash_profile
export DYLD_FRAMEWORK_PATH="${HOME}/opt/qt-4.6.0/lib:${DYLD_FRAMEWORK_PATH}"
在重新登录后,我们再次尝试导入vtk python模块:
$ python -c 'import vtk'
$
这次没有输出。问题已修复!