首页 > 解决方案 > 如何设置哪个 libstdc++.so 与 libarrow.so 链接?

问题描述

我在 Redhat 7.4 上使用 gcc7.2 从源代码构建 libarrow.so 和 pyarrow。尽管如此,我仍然遇到以下错误,这似乎是由使用不同版本的 gcc(4.8.5 与 7.2.0)引起的。

[u0017649@sys-97675 ~]$ python
Python 3.7.1 (default, Dec 14 2018, 19:46:41)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyarrow
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/u0017649/anaconda3/lib/python3.7/site-packages/pyarrow/__init__.py", line 47, in <module>
    from pyarrow.lib import cpu_count, set_cpu_count
ImportError: /usr/local/lib64/libarrow.so.13: undefined symbol: _ZN5boost6system16generic_categoryEv

我检查了 ldconfig,它清楚地表明 libarrow.so 与来自 Redhat OS(使用 gcc4.8.5 构建)的 libstdc++.so 链接,而不是与我自己使用 gcc7.2.0 构建的链接。

[u0017649@sys-97675 ~]$ sudo ldd /usr/local/lib64/libarrow.so.13
/usr/local/lib64/libarrow.so.13: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/local/lib64/libarrow.so.13)
/usr/local/lib64/libarrow.so.13: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /usr/local/lib64/libarrow.so.13)
/usr/local/lib64/libarrow.so.13: /lib64/libstdc++.so.6: version `CXXABI_1.3.11' not found (required by /usr/local/lib64/libarrow.so.13)
/usr/local/lib64/libarrow.so.13: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by /usr/local/lib64/libarrow.so.13)
/usr/local/lib64/libarrow.so.13: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/local/lib64/libarrow.so.13)
    linux-vdso64.so.1 =>  (0x00003fff92a70000)
    libbrotlienc.so.1 => not found
    libbrotlidec.so.1 => not found
    libbrotlicommon.so.1 => not found
    libdl.so.2 => /lib64/libdl.so.2 (0x00003fff924a0000)
    librt.so.1 => /lib64/librt.so.1 (0x00003fff92470000)
    liblz4.so.1 => /lib64/liblz4.so.1 (0x00003fff92430000)
    libsnappy.so.1 => /lib64/libsnappy.so.1 (0x00003fff92400000)
    libz.so.1 => /lib64/libz.so.1 (0x00003fff923c0000)
    libzstd.so.1.3.7 => not found
    libboost_system.so.1.68.0 => not found
    libboost_filesystem.so.1.68.0 => not found
    libboost_regex.so.1.68.0 => not found
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00003fff92230000)

我重新检查了我的 LD_LIBRARY_PATH,但看起来没问题。

[u0017649@sys-97675 ~]$ env | grep LD_ 
LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/lib:/lib64:/lib:

我做错了什么 ?我该如何解决这种情况?请帮忙。

标签: undefinedsymbolspyarrow

解决方案


没关系。我傻到在 ldd 前面白白使用 'sudo',这改变了 LD_LIBRARY_PATH 的环境变量。没有 sudo,正确的 LD_LIBRARY_PATH 设置,我可以看到一切都很好。


推荐阅读