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

Haskell Stack调用C++函数GHCi链接失败问题求助

问题解决:Stack GHCi无法链接C++函数的错误

解决链接错误的步骤

1. 修正package.yaml配置

移除顶层冗余的cxx-sources、cxx-options配置(全局配置不会被library区块正确继承,易导致编译逻辑混乱),仅保留library区块内的设置,并添加链接选项确保GHC能找到C++标准库:

include-dirs:
- src

library:
  source-dirs: src
  cxx-sources:
  - src/snf.cpp
  cxx-options:
  - -std=c++17
  link-options:
  - -lstdc++

2. 显式指定GHCi链接选项

若上述配置仍不生效,启动GHCi时手动传递链接参数强制加载C++标准库:

stack ghci --ghci-options="-lstdc++"

3. 验证C++符号导出

确认C++代码已正确导出目标符号:

  1. 找到Stack编译生成的snf.o文件(通常位于.stack-work/dist/<系统架构>/Cabal-<版本号>/build目录下)
  2. 执行以下命令检查符号是否存在:
nm -D snf.o | grep csmith_normal_form

若输出包含T csmith_normal_form,说明符号已正确导出;若为空,需再次检查extern "C"语法(你的代码中函数声明和定义均在extern "C"块内,这部分是正确的)。

Stack中C/C++相关选项的文档位置

  • cxx-sources、cxx-options等字段本质是Cabal的配置字段,Stack通过支持Cabal配置实现C++代码编译,相关内容可查阅Cabal官方用户指南的「处理外部代码」章节。
  • 若使用package.yaml(Hpack格式),可参考Hpack官方文档中对Cabal字段的映射说明,Hpack会将cxx-sources、cxx-options转换为对应的Cabal字段。
  • Stack官方文档中关于C/C++代码的处理,可查看其用户手册的「C代码开发」章节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:17:44