未定义符号:__atomic_exchange_8

Posted

技术标签:

【中文标题】未定义符号:__atomic_exchange_8【英文标题】:undefined symbol: __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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于未定义符号:__atomic_exchange_8的主要内容,如果未能解决你的问题,请参考以下文章

XCode 7 / Cordova 插件 / 链接问题:_utf8_nextCharSafeBody 未定义符号

Quickblox:架构 x86_64 的未定义符号:错误

将 Google AdMob SDK 从 7.7.0 更新到 7.8.0 未定义符号错误

Qt + cocoa:架构 x86_64 的未定义符号

架构 x86_64 颤动的未定义符号

未定义符号 体系结构 x86_64 的未定义符号:“_kCFAllocatorDefault”