DNF包管理器在树莓派4B上无法使用的问题

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']

希望社区的专家们能帮忙分析这个问题。如需要更多信息,再补充。感谢!