[英]How to Use Haskell's Stack Build Tool to Export a Library to Be Consumed by C/C++?
[英]How to include a dependency C library in Haskell Stack
我想创建一个Haskell Stack包,其中包含另一个Haskell Stack包作为extra-dep
。 有问题的是,我试图包含的包是使用Haskell的FFI绑定到某些C代码。
如果我只是stack unpack
和stack build
该包( HasCacBDD )它工作得很好,但当我把它作为一个extra-dep
堆栈抱怨丢失的库。
查看该原始包的Setup.hs
,我发现它基本上创建了一个名为libHasCacBDD.a
的静态库,并将其放在.stack-work
路径中的正确文件夹中,以便进行链接。 当我将它包含在我自己的项目中时,这个库正好是一个错误。
仔细查看我自己项目的.stack-work
文件夹,我看到提到的libHasCacBDD.a
确实在隐藏在某个地方的目录中。 幸运的是,库正在构建正确但我的项目找不到它。
官方的Haskell Stack文档说明了在这种情况下该怎么做,但我认为它不够具体,无法给我一个满意的答案。
我需要做的是指定libHasCacBDD.a
库作为extra-lib-dirs
选项存储的路径。 然而,我不知道如何以独立于平台的方式做到这一点(如果我在计算机中对路径进行硬编码,它将在其中工作,并且在这种情况下执行包的重点是什么)。
我在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三次:
stack path
以找出正在安装软件包的位置 find
您需要的特定文件 dirname
获取目录 其余行将该目录传递给stack
作为额外的库目录。 每次make
都执行此操作称为避免将路径放在文件中,在编译器或包版本更改时需要更新它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.