You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

aarch64 Linux静态链接Native Image中GraalPy运行Numpy报错求助

在静态链接GraalVM Native Image中运行依赖Numpy的GraalPy代码报错:Dynamic loading not supported

问题背景

在aarch64架构Linux平台上,基于静态链接的GraalVM Native Image构建了集成GraalPy的可执行程序,该程序可接收Python脚本路径并执行。运行无依赖的简单Python代码正常,但执行依赖Numpy的代码时,抛出以下错误:

SystemError: NFIUnsatisfiedLinkError: Dynamic loading not supported

错误原因

  1. 静态链接Native Image的限制:静态构建的Native Image默认禁用动态加载功能,而Numpy依赖底层的C扩展库(如OpenBLAS、LAPACK等),这些库通常以动态共享库(.so)形式存在,需要通过动态加载机制加载。
  2. GraalPy NFI的限制:GraalPy通过Native Function Interface(NFI)调用底层C代码,在静态链接的Native Image环境中,NFI无法执行动态加载操作,导致无法加载Numpy依赖的底层库。

解决方案

方案1:改用动态链接的Native Image(推荐)

修改构建配置,启用动态加载支持,放弃静态链接:

  1. 调整build.gradle中的Native Image构建参数:
graalvmNative {
    binaries {
        main {
            imageName = 'graalpy-runner'
            // 移除--static参数,启用动态加载
            buildArgs.add('--dynamic-loading=enabled')
            buildArgs.add('--initialize-at-build-time=org.python')
            buildArgs.add('--allow-incomplete-classpath')
            buildArgs.add('--enable-all-security-services')
            buildArgs.add('--features=org.graalvm.python.PythonFeature')
        }
    }
}
  1. 安装系统级依赖库(以Debian/Ubuntu为例):
sudo apt-get install libopenblas-dev liblapack-dev
  1. 重新构建Native Image并运行测试脚本。

方案2:静态链接Numpy依赖库(复杂场景)

若必须使用静态链接,需将Numpy依赖的所有C库静态编译后打包进Native Image:

  1. 静态编译Numpy依赖的底层库(如OpenBLAS、LAPACK),生成.a格式的静态库。
  2. 在Native Image构建参数中添加静态库引用:
buildArgs.add('--static')
buildArgs.add('--shared-library=/path/to/libopenblas.a')
buildArgs.add('--shared-library=/path/to/liblapack.a')
  1. 确保GraalPy初始化时能识别静态链接的库,可能需要调整Python环境变量或初始化参数。

验证步骤

  1. 执行构建命令重新生成可执行文件:
./gradlew nativeCompile
  1. 运行依赖Numpy的测试脚本:
./build/native/nativeCompile/graalpy-runner test_numpy.py
  1. 确认脚本正常输出,无动态加载错误。

内容的提问来源于stack exchange,提问作者陈楠林

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:02:15