2017-03-16 2 views
0

Je cours Fedora 25, qui est livré avec gcc/g++/libstdc++ version 6.3.1. Je cours également la version 4.3.1 d'Anaconda, qui vient avec libstdc++ 6.0.19.Installation d'Orange3 dans Anaconda: incompatibilité g ++ et libstdC++

Lors de l'installation Orange3 sous Anaconda (en disant "pip installer orange3"), certains fichiers sont compilés avec Fedoras g ++, mais liés contre Anacondas libstdC++:

Notez la troisième ligne de la sortie:

$ ldd ~/anaconda3/lib/python3.6/site-packages/Orange/widgets/utils/_grid_density.cpython-36m-x86_64-linux-gnu.so 
linux-vdso.so.1 (0x00007ffe9b5a2000) 
libpython3.6m.so.1.0 => /home/marhoy/anaconda3/lib/libpython3.6m.so.1.0 (0x00007efc3a6ef000) 
libstdc++.so.6 => /home/marhoy/anaconda3/lib/libstdc++.so.6 (0x00007efc3a3d9000) 
libm.so.6 => /lib64/libm.so.6 (0x00007efc3a0ad000) 
libgcc_s.so.1 => /home/marhoy/anaconda3/lib/libgcc_s.so.1 (0x00007efc39e97000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007efc39c79000) 
libc.so.6 => /lib64/libc.so.6 (0x00007efc398b1000) 
libdl.so.2 => /lib64/libdl.so.2 (0x00007efc396ad000) 
libutil.so.1 => /lib64/libutil.so.1 (0x00007efc394aa000) 
librt.so.1 => /lib64/librt.so.1 (0x00007efc392a2000) 
/lib64/ld-linux-x86-64.so.2 (0x000055a3c43d1000) 

Cela provoque des problèmes, car il existe des différences entre 6.3.1 et 6.0.19. Alors, quand je tente d'utiliser le widget diagramme de dispersion, je reçois:

_grid_density.cpython-36m-x86_64-linux-gnu.so: undefined symbol: __cxa_throw_bad_array_new_length

Si je LD_PRELOAD Fedoras libstdC++, tout semble bien fonctionner. Et si j'installe Orange3 en dehors d'Anaconda (en utilisant pip3 install --user orange3), cela fonctionne également.

La raison pour laquelle je n'installe pas Orange3 à partir du dépôt conda est qu'il est obsolète.

Alors: Comment puis-je faire le lien entre les fichiers Orange et mon Fedora libstdC++?

Répondre

0

Pourquoi _grid_density.cpython-36m-x86_64-linux-gnu.so récupère-t-il le fichier libstdC++. De ~/anaconda3/lib? En raison de RPATH:

(root)# chrpath -l /conda/lib/python3.6/site-packages/Orange/widgets/utils/_grid_density.cpython-36m-x86_64-linux-gnu.so 
/conda/lib/python3.6/site-packages/Orange/widgets/utils/_grid_density.cpython-36m-x86_64-linux-gnu.so: RPATH=/conda/lib 

Je suppose, vous avez probablement eu le paquet Conda libgcc installé et que vous ne l'avez pas le paquetage Conda gcc installé lors de l'installation à l'aide Orange3 pip. D'où le conflit.

Vous avez les options suivantes:

  1. Supprimer libgcc: conda remove -y libgcc
  2. Supprimer RPATH du fichier .so

    (root)# chrpath -d /conda/lib/python3.6/site-packages/Orange/widgets/utils/_grid_density.cpython-36m-x86_64-linux-gnu.so 
    (root)# chrpath -l /conda/lib/python3.6/site-packages/Orange/widgets/utils/_grid_density.cpython-36m-x86_64-linux-gnu.so 
    /conda/lib/python3.6/site-packages/Orange/widgets/utils/_grid_density.cpython-36m-x86_64-linux-gnu.so: no rpath or runpath tag found. 
    
  3. Convertir RPATH-RUNPATH:

    (root)# chrpath -c /conda/lib/python3.6/site-packages/Orange/widgets/utils/_grid_density.cpython-36m-x86_64-linux-gnu.so 
    

    Alors que vous pouvez remplacer plus tard en faisant:

    LD_LIBRARY_PATH=/lib64 /path/to/python/program 
    
  4. Créez votre propre forfait.

Je serais fortement opposé à l'option 2 ou 3. Vous ne pouvez faire 1 que s'il n'y a pas de dépendance sur ce paquet d'autres paquets. La meilleure solution est de faire 4, ou d'utiliser conda-forge (à partir de maintenant, il a v3.4.0).

$ pip uninstall Orange3 
$ conda install -c conda-forge orange3 

Vous pouvez jeter un oeil à la recette de orange3 à https://github.com/conda-forge/orange3-feedstock/tree/master/recipe, le modifier pour la dernière version que vous voulez (v3.4.1) et de le transférer à votre propre chaîne sur anaconda.org aussi!