操作系统银河Kylin v10
硬件平台 Taishan200 服务器
鲲鹏920CPU
昇腾300I DUO NPU
驱动25.5
固件8.5.0
glibc 2.28
答案内容由AI生成,仅供参考:
| 项目 | 建议 |
|---|---|
| 根本原因 | glibc 2.28 不支持 pthread_cond_clockwait |
| 推荐方案 | 降级 OpenCV 至 4.5.5 或 4.8.1 |
| 替代方案 | 修改 OpenCV 源码,替换为 pthread_cond_timedwait |
| 禁止操作 | 升级 glibc(高风险) |
| 构建建议 | 使用 build.sh 脚本,避免手动 CMake 编译 |
请优先尝试 方案一:降级 OpenCV 版本,这是最安全、最稳定的解决方式。
在编译 MindSpore 过程中,OpenCV 出现 pthread_cond_clockwait 未定义的链接错误,其根本原因是当前系统环境中的 glibc 版本过低,不支持 pthread_cond_clockwait 这一 POSIX 线程函数。
错误日志关键信息如下:
undefined reference to `pthread_cond_clockwait'
该符号是在 glibc 2.30 版本中引入的。而您的系统环境使用的是:
由于 pthread_cond_clockwait 在 glibc 2.28 中不存在,因此链接阶段失败,导致 OpenCV 编译中断,进而中断整个 MindSpore 的构建流程。
该问题通常出现在较旧系统上编译依赖较新 POSIX 接口的库(如 OpenCV 4.11.0)时。
MindSpore 构建过程中会自动拉取 OpenCV 作为第三方依赖。您可以指定一个兼容旧版 glibc 的 OpenCV 版本,避免使用引入 pthread_cond_clockwait 的高版本。
根据知识库信息和社区实践:
OpenCV ≤ 4.11.0.86 是已知兼容 NumPy < 2.0.0 及旧版 glibc 的稳定版本。
虽然版本号看起来不低于 4.11.0,但特定 patch 版本(如 .86)可能对底层调用做了适配或规避。
操作建议:
修改 MindSpore 源码中 cmake/external_libs/opencv.cmake 文件,强制指定 OpenCV 版本。
set(OPENCV_VERSION "4.5.5" CACHE STRING "OpenCV version to build")
推荐使用 OpenCV 4.5.5 或 4.8.1,这些版本在鲲鹏+昇腾平台上经过较多验证,且不依赖 pthread_cond_clockwait。
也可通过环境变量控制:
export MINDSPORE_OPENCV_VERSION=4.5.5
若您必须使用高版本 OpenCV(如 4.11.0),可尝试以下方法:
手动修改 OpenCV 源码中 async.cpp 文件:
modules/core/src/async.cppcv::AsyncArray::Impl::wait_for 函数,替换 pthread_cond_clockwait 为 pthread_cond_timedwait,后者在 glibc 2.28 中可用。// 原始调用(依赖 glibc >= 2.30)
// int rc = pthread_cond_clockwait(&cond_, &mutex_, CLOCK_MONOTONIC, &ts);
// 改为(兼容 glibc 2.28)
int rc = pthread_cond_timedwait(&cond_, &mutex_, &ts);
注意:时间结构体
ts需根据CLOCK_MONOTONIC正确构造。
修改后,将定制版 OpenCV 指定给 MindSpore 构建系统:
-DENABLE_OPENCV=OFF # 关闭自动下载
-DOpenCV_DIR=/path/to/your/custom/opencv/lib/cmake/opencv4
理论上可升级系统 glibc 至 2.30+,但 glibc 是系统核心库,升级风险极高,可能导致系统崩溃或软件不兼容,强烈不建议在生产环境或银河 Kylin 等国产系统上操作。
使用 MindSpore 官方编译脚本 build.sh
知识库显示,该脚本会自动处理依赖库的版本和配置,避免手动编译时的路径和依赖问题。
./build.sh -I aarch64 -e ascend
确保使用正确的编译器链
已知 MindSpore 使用 gcc 9.4.0 编译,建议统一工具链:
export CC=/usr/bin/gcc-9
export CXX=/usr/bin/g++-9
参考社区已知解决方案
类似问题已在 MindSpore 社区讨论,如 https://discuss.mindspore.cn/t/topic/1317 提供了依赖管理建议。
| 项目 | 建议 |
|---|---|
| 根本原因 | glibc 2.28 不支持 pthread_cond_clockwait |
| 推荐方案 | 降级 OpenCV 至 4.5.5 或 4.8.1 |
| 替代方案 | 修改 OpenCV 源码,替换为 pthread_cond_timedwait |
| 禁止操作 | 升级 glibc(高风险) |
| 构建建议 | 使用 build.sh 脚本,避免手动 CMake 编译 |
请优先尝试 方案一:降级 OpenCV 版本,这是最安全、最稳定的解决方式。
实际上当前的opencv.cmake的编写已经较为复杂,无法直接指定CV版本,主要涉及几个方面,一是sha256sum校验,二是生成的库名称包含*4110的版本号,三是并不能直接通过-DENABLE_OPENCV=OFF 禁止下载OpenCV。
另外有一种选项是作为对GITEE-EULER的支持,但该选项需要在线下载,自动解压等一系列操作,而我当前服务器处于离线状态,并不能直接使用该方法
用户您好,欢迎安装使用MindSpore。已收到上述问题,会尽快分析答复~
因为项目比较急,我通过重写async.cpp、cap_obsensor_capture.cpp和obsensor_stream_channel_v4l2.cpp中与wait_for相关的函数,临时解决该实现对pthread_cond_clockwait指向性问题。
不仅如此,完成编译并安装mindsporeXX.whl后,在Python中import mindspore,就会触发pthread_cond_clockwait的调用,仍然会报错。
Traceback (most recent call last):
File “”, line 1, in
File “/home/…/anaconda3/lib/python3.12/site-packages/mindspore/init.py”, line 18, in
from mindspore.run_check import run_check
File “/home/…/anaconda3/lib/python3.12/site-packages/mindspore/run_check/init.py”, line 17, in
from ._check_version import check_version_and_env_config
File “/home/…/anaconda3/lib/python3.12/site-packages/mindspore/run_check/_check_version.py”, line 584, in
check_version_and_env_config()
File “/home/…/anaconda3/lib/python3.12/site-packages/mindspore/run_check/_check_version.py”, line 456, in check_version_and_env_config
from mindspore._c_expression import MSContext, ms_ctx_param
ImportError: /home/…/anaconda3/lib/python3.12/site-packages/mindspore/lib/libmindspore_hardware_abstract.so: undefined symbol: pthread_cond_clockwait
@weixin_39625247 用户您好,此处问题已在下方链接中解决
关于 pthread_cond_clockwait无法兼容glibc<=2.30的问题
此话题已在最后回复的 60 分钟后被自动关闭。不再允许新回复。