我试图构建一个调用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文件中吗?如果是这样,那么如何解决这个问题呢?
编辑: 我知道这可以使用虚拟文件解决,但我想知道是否有更好的方法来做到这一点。