Haskell FFI项目:stack run正常但GHCi链接失败咨询
解决Stack + GHCi调用FFI外部函数的链接问题
不需要专门为GHCi维护单独的手动编译.o文件,Stack提供了自动处理C++源文件编译和GHCi依赖加载的方案,以下是具体说明和解决方法:
问题根源
stack run会自动识别package.yaml中的cxx-sources配置,编译所有C源文件并链接到可执行程序中,因此运行正常。但默认stack ghci启动时,不会自动编译并加载这些C对象文件,导致交互会话中找不到外部函数符号。
解决方案
方案1:用stack build --ghci启动会话
这是最简便的解决方式,直接执行:
stack build --ghci
该命令会先完成项目的完整构建(包括编译所有C++源文件为对象文件),再启动GHCi,并自动将编译好的对象文件、依赖库(如stdc++)加载到会话中。此时调用main即可正常执行,无需手动处理任何.o文件。
方案2:配置package.yaml自动传递对象文件
如果习惯直接用stack ghci启动,可在package.yaml中添加ghci-options,指定加载Stack构建目录中的C++对象文件(替换your-package-name为你的实际包名):
ghci-options: - $(stack path --dist-dir)/build/your-package-name/build/your-package-name/cbits/hello.o - -lstdc++
配置完成后,直接运行stack ghci即可,Stack会自动解析路径变量并加载对应对象文件。
方案3:将C代码编译为静态库(适合多C文件场景)
若项目包含大量C++代码,可将其打包为静态库,让Stack统一管理链接:
- 在cbits目录下创建Makefile:
libhello.a: hello.o ar rcs libhello.a hello.o hello.o: hello.cpp hello.h g++ -std=c++17 -c hello.cpp -o hello.o
- 修改package.yaml配置:
include-dirs: - cbits extra-lib-dirs: - cbits extra-libraries: - hello - stdc++
- 后续运行
stack build或stack ghci时,Stack会自动链接静态库,无需手动维护.o文件。
内容的提问来源于stack exchange,提问作者Spaghetti
相关产品推荐
相关产品推荐

