首页 文章

如何在Haskell Stack中包含依赖C库

提问于
浏览
5

我想创建一个Haskell Stack包,其中包含另一个Haskell Stack包作为 extra-dep . 问题是那个包裹我是FFI .

如果我只是 stack unpackstack build 那个包(HasCacBDD)它工作正常,但是当我把它包含为 extra-dep 时,堆栈抱怨缺少库 .

查看原始包的 Setup.hs ,我发现它基本上创建了一个名为 libHasCacBDD.a 的静态库,并将其放在 .stack-work 路径中的正确文件夹中,以便进行链接 . 当我将它包含在我自己的项目中时,这个库正好是一个错误 .

仔细查看我自己项目的 .stack-work 文件夹,我看到提到的 libHasCacBDD.a 确实在隐藏在某个地方的目录中 . 幸运的是,库正在构建正确,但我的项目找不到它 .

官方Haskell Stack文件说明了在这种情况下应该做些什么,但我认为这不足以给我一个满意的答案 .

我需要做的是指定 libHasCacBDD.a 库存储为 extra-lib-dirs 选项的路径 . 然而,我不知道如何以独立于平台的方式做到这一点(如果我在计算机中对路径进行硬编码,那么它将在其中工作,在这种情况下执行包的重点是什么) .

我创建了一个issue on Github,其中包含有关详细信息的更多信息 .

有什么建议?

1 回答

  • 0

    我在过去使用Makefile查找本地目录,并使用参数包装我常用的堆栈命令来使用它 .

    LIB_DIR :=$(shell dirname $(shell find $(shell stack path --local-install-root) -name libHasCacBDD.a))
    ARGS = --extra-lib-dirs ${LIB_DIR}
    
    test:
        stack ${ARGS} test --fast -j4
    

    丑陋,但它的工作原理 .

    ETA:第一行调用shell三次:

    • stack path 找出正在安装软件包的位置

    • find 找到您需要的特定文件

    • dirname 获取目录

    其余行将该目录作为额外的库目录传递给 stack . 每次调用 make 时执行此操作都会避免将路径放在文件中,在编译器或包版本更改时需要更新该文件 .

相关问题