A estrutura errada do Mac OS X é carregada
Pergunta
Compilei um módulo Python usando minha própria biblioteca Qt4 localizada em ~/opt/qt-4.6.0/
, mas quando tento importar esse módulo, as bibliotecas dinâmicas que são carregadas são da minha instalação 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 ...]
>>>
Existe uma maneira de dizer ao Python (também instalado no MacPorts) para carregar os frameworks localizados no meu ~/opt/qt-4.6.0/lib/
diretório?Não tenho certeza de quais variáveis de ambiente alterar.
Solução
Tente definir o DYLD_LIBRARY_PATH
para colocar suas bibliotecas em ~/opt/qt/...
antes das bibliotecas dos MacPorts antes de invocar o python (dê uma olhada em ~/.profile
para ver um exemplo de como fazer isso se você não souber;MacPorts faz exatamente a mesma coisa para colocar suas bibliotecas no DYLD_LIBRARY_PATH
). dyld
, o vinculador dinâmico do OS X usa DYLD_LIBRARY_PATH
encontrar bibliotecas em tempo de carregamento (entre outros métodos);Ver man dyld
para mais informações.
Outras dicas
Ok, depois que Barry Wark me indicou dyld(1)
, a página de manual descreveu uma série de variáveis que eu poderia definir.
A primeira dica veio da configuração da variável de ambiente DYLD_PRINT_LIBRARIES
, para que eu pudesse ver quais bibliotecas estavam sendo carregadas.
$ 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 ...]
$
Ah, então os frameworks para qt4-mac foram realmente carregados primeiro, como suspeitávamos.Relendo a página de manual, a próxima coisa que podemos tentar é mudar o DYLD_FRAMEWORK_PATH
para que saiba onde procurar.Agora adicionei esta linha ao final do meu ~/.bash_profile
export DYLD_FRAMEWORK_PATH="${HOME}/opt/qt-4.6.0/lib:${DYLD_FRAMEWORK_PATH}"
e após fazer login novamente, tentamos importar o módulo vtk python novamente:
$ python -c 'import vtk'
$
Não há saída desta vez.Problema corrigido!