我正在运行Fedora 25,它带有gcc/g++/libstdc++
版本6.3.1。
我还运行了Anaconda版本4.3.1,它带有libstdc++ 6.0.19
。
当我在Anaconda下安装Orange3时(通过说" pip install orange3"),一些文件是用Fedoras g ++编译的,但链接到Anacondas libstdc ++:
注意输出的第三行:
$ 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)
这会导致问题,因为6.3.1和6.0.19之间存在差异。因此,当我尝试使用散点图小部件时,我得到:
_grid_density.cpython-36m-x86_64-linux-gnu.so: undefined symbol: __cxa_throw_bad_array_new_length
如果我LD_PRELOAD Fedoras libstdc ++,一切似乎都运行良好。 如果我在Anaconda之外安装Orange3(通过使用pip3 install --user orange3),它也可以。
我没有从conda存储库安装Orange3的原因是它已经过时了。
所以:如何针对我的Fedora libstdc ++制作Orange-files链接?
答案 0 :(得分:0)
为什么_grid_density.cpython-36m-x86_64-linux-gnu.so
拿起libstdc ++。所以来自〜/ anaconda3 / lib?因为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
我猜,您可能安装了conda软件包libgcc
,并且在使用pip安装Orange3时没有安装conda软件包gcc
。因此,冲突。
您有以下选择:
conda remove -y libgcc
从.so文件中删除RPATH
(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.
将RPATH
转换为RUNPATH
:
(root)# chrpath -c /conda/lib/python3.6/site-packages/Orange/widgets/utils/_grid_density.cpython-36m-x86_64-linux-gnu.so
以便稍后通过执行以下操作覆盖它:
LD_LIBRARY_PATH=/lib64 /path/to/python/program
构建自己的包。
我强烈反对选项2或3.只有当其他包中没有依赖该包时,才能执行1。最好的解决方案是做4,或使用conda-forge(截至目前,它有v3.4.0)。
$ pip uninstall Orange3
$ conda install -c conda-forge orange3
您可以在https://github.com/conda-forge/orange3-feedstock/tree/master/recipe查看orange3的配方,将其修改为您想要的最新版本(v3.4.1),并将其上传到anaconda.org上您自己的频道!