Cabal安装Haskell FFI项目时无法识别指定的头文件目录及头文件
Cabal安装Haskell FFI项目时无法识别指定的头文件目录及头文件
看起来问题出在cabal install的工作机制上:它默认会先创建一个sdist(源代码分发)包,然后在临时目录中解压这个包并进行构建。如果你的sdist包中没有包含include目录及其下的头文件,那么在临时构建环境中这些目录/文件就会“不存在”,从而触发你看到的错误。
下面是具体的排查和解决步骤:
1. 验证sdist包是否包含必要文件
首先确认你的sdist包是否遗漏了include目录和相关文件:
- 运行
cabal sdist生成最新的sdist包 - 解压
dist-newstyle/sdist/CalcLangFinal-0.1.0.0.tar.gz到临时目录 - 检查解压后的目录中是否存在
include文件夹,以及里面的.h文件和src/c下的.c文件
如果这些文件不存在,那就是问题的核心原因:Cabal默认不会自动将include目录下的头文件包含到sdist包中,需要显式指定。
2. 修改Cabal文件,添加extra-source-files字段
在你的CalcLangFinal.cabal文件中,添加extra-source-files配置,告诉Cabal将这些必要的非Haskell文件包含到sdist包中。你可以在cabal文件的顶层(所有section之外)或者executable CCalcLang section内添加:
extra-source-files: include/c/CalcLangAstC.h include/c/CalcLangCompiler.h include/haskell/CalcLangParser_stub.h src/c/CalcLangAstC.c src/c/CalcLangCompiler.c
如果想更灵活,也可以使用通配符匹配所有相关文件:
extra-source-files: include/**/*.h src/c/**/*.c
3. 重新构建并安装
完成配置修改后,执行以下步骤:
- 清理旧的构建缓存:
cabal clean - 重新生成sdist包:
cabal sdist - 执行安装:
cabal install
临时替代方案(本地快速安装)
如果你只是想在本地快速安装而不想处理sdist配置,可以使用--inplace参数,让Cabal直接从本地项目目录构建,而不生成sdist包:
cabal install --inplace
额外检查点
- 确保你在项目根目录(
CalcLangFinal.cabal所在目录)执行所有Cabal命令 - 确认
include-dirs和includes的路径配置没有拼写错误(从你的目录结构看是正确的)
内容来源于stack exchange
相关产品推荐
相关产品推荐

