加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:01:11 所属栏目:百科 来源:网络整理
导读:我想创建一个 Haskell Stack包,其中包含另一个Haskell Stack包作为extra-dep.有问题的是,我试图包含的包是使用Haskell的FFI绑定到某些C代码. 如果我只是堆栈解压缩和堆栈构建该包(HasCacBDD)它工作正常,但当我包含它作为一个额外的dep堆栈抱怨缺少库. 查看该
我想创建一个 Haskell Stack包,其中包含另一个Haskell Stack包作为extra-dep.有问题的是,我试图包含的包是使用Haskell的FFI绑定到某些C代码.

如果我只是堆栈解压缩和堆栈构建该包(HasCacBDD)它工作正常,但当我包含它作为一个额外的dep堆栈抱怨缺少库.

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

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

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

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

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

有什么建议?

解决方法

我在过去使用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三次:

>堆栈路径以找出正在安装软件包的位置
>找到您需要的特定文件
> dirname获取目录

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读