web-dev-qa-db-fra.com

Problème de construction cx_Oracle - libclntsh.so.11.1 => introuvable

J'essaie de construire cx_Oracle pour une installation Python 2.7.2 et Oracle 11g mais le cx_Oracle.so intégré ne peut pas trouver libclntsh.so.11.1, donc l'importation de cx_Oracle dans Python échoue.

/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)

J'ai libclntsh.so.11.1 dans mon répertoire d'installation du client 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

Et le setup.py cx_Oracle prend ce répertoire lib up:

/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

Quelque chose ne va évidemment pas avec cette configuration?

Merci

MISE À JOUR

Mon LD_LIBRARY_PATH contient le répertoire lib ci-dessus avec libclntsh.so.11.1

$ echo $LD_LIBRARY_PATH
/apps/Oracle/client/11.2.0.1/lib

Cela ne semble faire aucune différence. Je reconstruis le fichier cx_Oracle.so et il affiche toujours libclntsh.so.11.1 => not found quand je lance $ ldd cx_Oracle.so.

Python n'a pas pu charger le module construit:

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

RÉSOLU

Le problème était lié à la variable d'environnement LD_LIBRARY_PATH. En raison de restrictions sur la configuration avec laquelle je travaille (corp env), j'ai dû créer cx_Oracle en tant qu'autre utilisateur (compte système). c'est-à-dire que je dirigeais ceci:

$ Sudo -u username python27 setup.py build

Donc, même si LD_LIBRARY_PATH a été défini correctement pour moi, ma version n'a pas été utilisée lorsque la commande a été exécutée en tant qu'utilisateur différent. J'ai pu créer avec succès en déplaçant le code source vers un emplacement où j'avais des autorisations et en exécutant la génération en tant qu'utilisateur.

27
Alex

Ajouter /apps/Oracle/client/11.2.0.1/home1/lib/ à ton LD_LIBRARY_PATH variable d'environnement exécuter la commande ci-dessous dans le terminal avant d'exécuter python ou l'ajouter dans votre .bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/apps/Oracle/client/11.2.0.1/home1/lib/
26
Meitham

Oui. Vous avez oublié de dire à votre outil de cache de chargeur qu'il doit rechercher dans ce répertoire les bibliothèques. Ajoutez ce répertoire à /etc/ld.so.conf ou un fichier similaire et exécutez ldconfig.

1

Définissez LD_RUN_PATH. (LD_RUN_PATH est utilisé par l'éditeur de liens pour spécifier où rechercher les bibliothèques uniquement au moment de l'exécution.)

Maintenant, construisez 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

Cela ne nécessitera pas le réglage de LD_LIBRARY_PATH lors de l'importation de cx_Oracle.

0
RoshP

De nombreux produits Oracle installent oraenv. Il définira, entre autres variables d'environnement, LD_LIBRARY_PATH, alors envisagez d'exécuter . oraenv au lieu de configurer votre environnement manuellement.

0
Ekevoo