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++代码已正确导出目标符号:
- 找到Stack编译生成的
snf.o文件(通常位于.stack-work/dist/<系统架构>/Cabal-<版本号>/build目录下) - 执行以下命令检查符号是否存在:
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
相关产品推荐
相关产品推荐

