使用Shake和Stack

时间:2016-12-04 15:23:16

标签: c++ haskell dynamic-linking haskell-stack shake-build-system

我试图构建一个调用Haskell函数的简单C ++项目(可执行文件), 使用Shake构建脚本并从脚本中调用Stack来构建Haskell库。

我们假设Haskell库名为haskell-simple-lib

动摇脚本调用stack install haskell-simple-lib,输出.so个文件:libHShaskell-simple-lib-*version*-*unique identifier*.so

My Shake规则取决于文件名,因此我无法使用上述名称,因为我事先并不知道唯一标识符是什么。因此,Shake脚本在文件上运行cp_build/libHShaskell-simple-lib.so

C ++可执行文件的链接选项包含-L_build-lhaskell-simple-lib

当我尝试运行可执行文件时,我收到错误消息:

error while loading shared libraries: libHShaskell-simple-lib-0.1.0.0-8DkaSm3F3d44RUd03fOuDx-ghc7.10.2.so: cannot open shared object file: No such file or directory

但是,如果我将我复制到_build的文件重命名为stack install输出的原始名称(具有唯一标识符的文件),则可执行文件正确运行。

有人会认为我需要做的只是将cp文件简单地_build而不删除名称中的唯一标识符,但我需要知道{{1}的名称提前提交震动脚本。

我不明白为什么在运行可执行文件时会搜索原始的.so文件名。链接标记不提及.so输出的.so的全名,仅stack install。 可能是原始名称嵌入在.so文件中吗?如果是这样,那么如何解决这个问题呢?

编辑: 我知道这可以使用虚拟文件解决,但我想知道是否有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

原始标识符嵌入在.so中。我不记得所有的细节,但我确实知道我过去使用MouseEvent.clientX麻烦解决了这些问题。