未定义符号:__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 未定义符号