Problema ao construir cx_Oracle - libclntsh.so.11.1 => não encontrado
Pergunta
Estou tentando construir cx_Oracle para uma instalação do Python 2.7.2 e Oracle 11g, mas o cx_Oracle.so construído não consegue encontrar libclntsh.so.11.1, portanto, a importação de cx_Oracle em Python falha.
/mypath/cx_Oracle-5.1.1/build/lib.linux-x86_64-2.7-11g]$ ldd cx_Oracle.so
libclntsh.so.11.1 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ae9be290000)
libc.so.6 => /lib64/libc.so.6 (0x00002ae9be4ab000)
/lib64/ld-linux-x86-64.so.2 (0x000000389b600000)
Eu tenho libclntsh.so.11.1 no meu diretório de instalação do cliente Oracle:
/apps/oracle/client/11.2.0.1/home1/lib]$ ls -l libclntsh.so*
libclntsh.so -> /apps/oracle/client/11.2.0.1/home1/lib/libclntsh.so.11.1
libclntsh.so.11.1
E o cx_Oracle setup.py está selecionando este diretório lib:
/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build
/apps/oracle/client/11.2.0.1/home1/
running build
running build_ext
building 'cx_Oracle' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/apps/oracle/client/11.2.0.1/home1/rdbms/demo -I/apps/oracle/client/11.2.0.1/home1/rdbms/public -I/apps/bweb/python-2.7.2/include/python2.7 -c cx_Oracle.c -o build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -DBUILD_VERSION=5.1.1
In file included from /apps/oracle/client/11.2.0.1/home1/rdbms/public/oci.h:3024,
from cx_Oracle.c:10:
/apps/oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10788: warning: function declaration isn't a prototype
/apps/oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10794: warning: function declaration isn't a prototype
gcc -pthread -shared build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -L/apps/oracle/client/11.2.0.1/home1/lib -lclntsh -o build/lib.linux-x86_64-2.7-11g/cx_Oracle.so
Há algo obviamente errado com esta configuração?
Obrigado
ATUALIZAR
Meu LD_LIBRARY_PATH contém o diretório lib acima com libclntsh.so.11.1
$ echo $LD_LIBRARY_PATH
/apps/oracle/client/11.2.0.1/lib
Isso não parece fazer nenhuma diferença.Eu reconstruo o arquivo cx_Oracle.so e ele ainda aparece libclntsh.so.11.1 => not found
quando eu corro $ ldd cx_Oracle.so
.
Python falhando ao carregar o módulo construído:
Python 2.7.2 (default, Jan 19 2012, 14:38:32)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
RESOLVIDO
A questão estava relacionada com LD_LIBRARY_PATH variável de ambiente.Devido a restrições na configuração com a qual estou trabalhando (ambiente corp), tive que construir cx_Oracle como outro usuário (conta do sistema).ou sejaEu estava executando isso:
$ sudo -u username python27 setup.py build
Então mesmo que LD_LIBRARY_PATH foi definido corretamente para mim, minha versão não foi usada quando o comando foi executado como um usuário diferente.Consegui construir com sucesso movendo o código-fonte para um local onde eu tinha permissões e executando a construção como meu usuário.
Solução
Adicionar /apps/oracle/client/11.2.0.1/home1/lib/
para o seu LD_LIBRARY_PATH
Variável de ambiente execute o comando abaixo no terminal antes de executar o python ou adicioná -lo ao seu .bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/apps/oracle/client/11.2.0.1/home1/lib/
Outras dicas
Sim.Você se esqueceu de informar à ferramenta de cache do carregador que ela precisa procurar bibliotecas nesse diretório.Adicione esse diretório ao /etc/ld.so.conf
ou um arquivo semelhante e execute ldconfig
.
Muitos produtos Oracle instalam o oraenv.Ele definirá, entre outras variáveis de ambiente, LD_LIBRARY_PATH
, então considere correr . oraenv
em vez de configurar seu ambiente manualmente.
Colocou o LD_RUN_PATH.( LD_RUN_PATH é usado pelo vinculador para especificar onde procurar bibliotecas somente em tempo de execução.)
Agora construa cx_Oracle.
/mypath/cx_Oracle-5.1.1]$ export LD_RUN_PATH="/apps/oracle/client/11.2.0.1/home1/lib"
/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build
Isso não exigirá a configuração de LD_LIBRARY_PATH durante a importação de cx_Oracle.