【问题标题】:Installing Orange3 in Anaconda: Mismatching g++ and libstdc++在 Anaconda 中安装 Orange3:g++ 和 libstdc++ 不匹配
【发布时间】:2017-03-16 09:12:28
【问题描述】:

我正在运行 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 的原因是它已经过时了。

那么:我怎样才能使 Orange-files 链接针对我的 Fedora libstdc++?

【问题讨论】:

    标签: python anaconda orange fedora-25


    【解决方案1】:

    为什么_grid_density.cpython-36m-x86_64-linux-gnu.so 会从 ~/anaconda3/lib 中获取 libstdc++.so ?因为 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。于是就有了冲突。

    您有以下选择:

    1. 删除 libgcc:conda remove -y libgcc
    2. 从 .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.
      
    3. 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
      
    4. 构建您自己的包。

    我强烈反对选项 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 上的频道!

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 2018-07-25
      • 1970-01-01
      相关资源
      最近更新 更多