【问题标题】:undefined symbol: __atomic_exchange_8未定义符号:__atomic_exchange_8
【发布时间】:2022-01-02 03:18:11
【问题描述】:

我正在尝试按照以下步骤在我的树莓派上运行谷歌助手:https://developers.google.com/assistant/sdk/guides/service/python/embed/run-sample

在使用以下命令激活 Google 助理之前一切正常: googlesamples-assistant-pushtotalk --project-id my-dev-project --device-model-id my-model

我收到以下 ImportError:

Traceback (most recent call last):
  File "/home/pi/env/bin/googlesamples-assistant-pushtotalk", line 5, in <module>
    from googlesamples.assistant.grpc.pushtotalk import main
  File "/home/pi/env/lib/python3.9/site-packages/googlesamples/assistant/grpc/pushtotalk.py", line 28, in <module>
    import grpc
  File "/home/pi/env/lib/python3.9/site-packages/grpc/__init__.py", line 22, in <module>
    from grpc import _compression
  File "/home/pi/env/lib/python3.9/site-packages/grpc/_compression.py", line 15, in <module>
    from grpc._cython import cygrpc
ImportError: /home/pi/env/lib/python3.9/site-packages/grpc/_cython/cygrpc.cpython-39-arm-linux-gnueabihf.so: undefined symbol: __atomic_exchange_8

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: python-3.x google-assistant-sdk raspberry-pi4 grpc-python


    【解决方案1】:

    刚刚结束,因为我遇到了同样的问题(在不同的项目上),但也涉及 python3.9,在 RPi4 上使用最近的 raspbian-lite(32 位)的 cygrpc。

    虽然我没有解决方案,但我的猜测是: 以前 __atomic_exchange_8 是在 /lib/arm-linux-gnueabihf/libgcc_s.so.1 中定义的,但现在它似乎是在 libatomic 中定义的:

    $ grep __atomic_exchange_8 /lib/arm-linux-gnueabihf/libatomic.so.1
    grep: /lib/arm-linux-gnueabihf/libatomic.so.1: binary file matches
    

    编辑:

    解决了。我在看两年前试图解决问题的补丁:

    https://github.com/grpc/grpc/pull/20514/commits/b912fc7d8d401bb65b3147ee77d03beaa3d46038

    我认为他们的测试 check_linker_need_libatomic() 可能已损坏,并再次对其进行修补以始终返回 True,问题得到了解决。 之前曾尝试通过添加 CFLAGS='-latomic' CPPFLAGS='-latomic' 来修复它,但这并没有帮助。

    这是我今天的 grpc git HEAD 的小解决方法(不是修复!):

    root@mypi:/home/pi/CODE/grpc# git diff
    diff --git a/setup.py b/setup.py
    index 1a72c5c668..60b7705cd2 100644
    --- a/setup.py
    +++ b/setup.py
    @@ -197,6 +197,7 @@ ENABLE_DOCUMENTATION_BUILD = _env_bool_value(
    
     def check_linker_need_libatomic():
         """Test if linker on system needs libatomic."""
    +    return True
         code_test = (b'#include <atomic>\n' +
                      b'int main() { return std::atomic<int64_t>{}; }')
         cxx = os.environ.get('CXX', 'c++')
    diff --git a/tools/distrib/python/grpcio_tools/setup.py b/tools/distrib/python/grpcio_tools/setup.py
    index 6b842f56b9..8d5f581ac7 100644
    --- a/tools/distrib/python/grpcio_tools/setup.py
    +++ b/tools/distrib/python/grpcio_tools/setup.py
    @@ -85,6 +85,7 @@ BUILD_WITH_STATIC_LIBSTDCXX = _env_bool_value(
    
     def check_linker_need_libatomic():
         """Test if linker on system needs libatomic."""
    +    return True
         code_test = (b'#include <atomic>\n' +
                      b'int main() { return std::atomic<int64_t>{}; }')
         cxx = os.environ.get('CXX', 'c++')
    root@mypi:/home/pi/CODE/grpc#
    

    编辑:

    作为快速测试,cygrpc.cpython-39-arm-linux-gnueabihf.so 需要依赖于libatomic

    pi@mypi:~/CODE/grpc $ ldd /usr/local/lib/python3.9/dist-packages/grpc/_cython/cygrpc.cpython-39-arm-linux-gnueabihf.so
            linux-vdso.so.1 (0xbeef7000)
            /usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so => /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so (0xb698b000)
            libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb695f000)
            libatomic.so.1 => /lib/arm-linux-gnueabihf/libatomic.so.1 (0xb6946000)
            libstdc++.so.6 => /lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb67be000)
            libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb674f000)
            libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb65fb000)
            /lib/ld-linux-armhf.so.3 (0xb6fcc000)
            libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb65ce000)
    

    【讨论】:

    • 可能是他们的配置测试中的简单负载可以内联,因此不需要 libatomic,但更复杂的原子操作确实需要它。这似乎不是一个好的测试。
    • 感谢您的宝贵时间!我似乎找不到 setup.py 文件。我的 grpc 文件夹中没有这样的文件。我究竟做错了什么? (抱歉刚刚开始使用 rapberryPI)
    • 不要通过包管理器安装 grpc,而是从 github 的源代码安装和构建它。首先卸载包管理器变体:apt-get remove grpc 然后从 github 获取源代码:git clone https://github.com/grpc/grpc.git 然后应用我的补丁并通过以下方式编译和安装它:sudo python3 setup.py install
    【解决方案2】:

    编辑:更新为gRPC v1.44.0。该问题已在那里修复,请参阅旧答案中的以下说明。

    编译器使用problem with the order of the parameters编译一些测试代码,其结果用于确定是否需要链接libatomic。
    该问题将在 grpc 的下一个版本中修复。如果他们保持与以前版本相同的时间表,则应该是 v1.44.0,它应该会在下个月的某个时间发布。
    同时你可以 git cherry-pick the proper fix 自己构建 grpc

    【讨论】:

      【解决方案3】:

      这适用于我在 RPI0 + Bullseye + Python3.9 上:

      pip3 uninstall -y grpcio grpcio-tools
      sudo apt install -y python3-grpcio python3-grpc-tools
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 2012-09-05
        • 2017-06-25
        • 2018-06-19
        • 2021-03-31
        • 2016-06-23
        • 2021-02-18
        相关资源
        最近更新 更多