openEuler 版本
- 基于Yocto构建的openEuler嵌入式版本 openEuler Embedded
- 目标平台: 树莓派4B (aarch64)
问题现象及影响
运行dnf命令时出现Python库依赖错误,具体报错如下:
raspberrypi4-64 ~ # dnf -v
Traceback (most recent call last):
File "/usr/bin/dnf", line 61, in <module>
from dnf.cli import main
File "/usr/lib64/python3.10/site-packages/dnf/__init__.py", line 30, in <module>
import dnf.base
File "/usr/lib64/python3.10/site-packages/dnf/base.py", line 29, in <module>
import libdnf.transaction
File "/usr/lib64/python3.10/site-packages/libdnf/__init__.py", line 13, in <module>
from . import common_types
File "/usr/lib64/python3.10/site-packages/libdnf/common_types.py", line 10, in <module>
from . import _common_types
ImportError: /usr/lib64/python3.10/site-packages/libdnf/_common_types.so: undefined symbol: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm, version GLIBCXX_3.4.21
这导致无法使用DNF进行软件包的安装、更新等操作。
复现路径
1. 使用Yocto构建系统编译openEuler树莓派镜像:
- 使用的层:
/usr1/openeuler/src/yocto-poky/meta \ /usr1/openeuler/src/yocto-poky/../yocto-meta-openembedded/meta-oe \ /usr1/openeuler/src/yocto-poky/../yocto-meta-openembedded/meta-python \ /usr1/openeuler/src/yocto-poky/../yocto-meta-openembedded/meta-networking \ /usr1/openeuler/src/yocto-poky/../yocto-meta-openembedded/meta-filesystems \ /usr1/openeuler/src/yocto-poky/../yocto-meta-openeuler/meta-openeuler \ /usr1/openeuler/src/yocto-poky/../yocto-meta-openeuler/bsp/meta-openeuler-bsp \ /usr1/openeuler/src/yocto-poky/../yocto-meta-raspberrypi \
- local.conf中已添加包配置:
#===========the content is user added==================
MACHINE = "raspberrypi4-64"
EXTRA_IMAGE_FEATURES += "package-management"
2. 将镜像烧录到SD卡并启动树莓派
3. 在树莓派系统中执行任何dnf命令都会出现上述错误
已尝试的解决方法
1. 检查libstdc++版本及GLIBCXX符号:
结果显示系统中已包含GLIBCXX_3.4.21及更新版本。
raspberrypi4-64 ~ # strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH
2. 检查库路径和ldconfig缓存:
显示库已正确链接:
raspberrypi4-64 ~ # ldconfig -p | grep libstdc++
libstdc++.so.6 (libc6,AArch64) => /usr/lib64/libstdc++.so.6
3. 检查具体库文件:
结果显示:
raspberrypi4-64 ~ # ls -la /usr/lib64/libstdc++*
lrwxrwxrwx 1 root root 19 Mar 9 12:34 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.30
-rwxr-xr-x 1 root root 1313096 Mar 9 12:34 /usr/lib64/libstdc++.so.6.0.30
-rwxr-xr-x 1 root root 2504 Mar 9 12:34 /usr/lib64/libstdc++.so.6.0.30-gdb.py
资源配置
- 编译主机信息:
uname -a
Linux localhost.localdomain 6.6.0-72.0.0.76.oe2403sp1.x86_64 #1 SMP Fri Dec 27 12:13:01 CST 2024 x86_64 x86_64 x86_64 GNU/Linux
- 目标硬件平台: 树莓派4B
- CPU架构: aarch64
- Python版本: 3.10.9
- 系统库:
- libstdc++.so.6.0.30
- Python 3.10相关库
其他信息
1. DNF相关Python模块路径情况:
raspberrypi4-64 ~ # ls /usr/lib64/python3.10/site-packages/dnf/
__init__.py base.py comps.py crypto.py drpm.py history.py logging.py package.py pycomp.py repodict.py selector.py transaction_sr.py
__pycache__ callback.py conf db exceptions.py i18n.py match_counter.py persistor.py query.py rpm subject.py util.py
automatic cli const.py dnssec.py goal.py lock.py module plugin.py repo.py sack.py transaction.py yum
raspberrypi4-64 ~ # ls /usr/lib64/python3.10/site-packages/libdnf/
__init__.py _common_types.so _error.so _repo.so _transaction.so common_types.py error.py repo.py transaction.py
__pycache__ _conf.so _module.so _smartcols.so _utils.so conf.py module.py smartcols.py utils.py
2. Python路径配置:
raspberrypi4-64 ~ # python3 -c "import sys; print(sys.path)"
['', '/usr/lib64/python310.zip', '/usr/lib64/python3.10', '/usr/lib64/python3.10/lib-dynload', '/usr/lib64/python3.10/site-packages']
希望社区的专家们能帮忙分析这个问题。如需要更多信息,再补充。感谢!