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

Haskell共享库加载异常:编译成功但运行时符号未定义

解决Haskell共享库运行时符号缺失问题

我来帮你搞定这个运行时报错的问题!你遇到的stg_thawArrayzh符号缺失,本质是测试程序没正确链接GHC的运行时系统(RTS)库——这个符号是RTS提供的核心运行时函数,你的测试程序编译时没把它拉进来。下面是具体的修复步骤:

1. 修正测试程序的编译命令

你的原命令只编译了C代码,但没链接自己生成的libsafe.so,也没关联GHC的运行时库。把命令改成这样:

ghc --make -no-hs-main -optc-O test.c -L. -lsafe -lHSrts-ghc8.0.2 -o test

各参数的作用:

  • -L.:告诉编译器在当前目录查找库文件
  • -lsafe:链接你编译好的libsafe.so共享库
  • -lHSrts-ghc8.0.2:强制链接GHC运行时库,这正是提供stg_thawArrayzh符号的关键依赖

2. 让系统能找到你的自定义共享库

运行测试程序前,需要让系统加载器定位到libsafe.so,有两种方式:

  • 临时设置环境变量(重启终端后失效):
    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    ./test
    
  • 编译时永久嵌入路径(推荐):
    在测试程序编译命令里加上-Wl,-rpath,.,把当前目录加入库搜索路径:
    ghc --make -no-hs-main -optc-O test.c -L. -lsafe -lHSrts-ghc8.0.2 -Wl,-rpath,. -o test
    

3. 优化共享库编译命令(可选)

你原有的共享库编译命令可以简化,单个模块编译不需要--make参数:

ghc -dynamic -shared -fPIC Safe.hs -o libsafe.so

这个命令会生成动态链接到GHC基础库的共享库,确保依赖关系更清晰。

如果还是有问题,可以用ldd libsafe.so命令检查共享库的依赖链,确认它正确关联了GHC的ghc-prim和rts库。

内容的提问来源于stack exchange,提问作者Ed Behn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:13:12