【发布时间】:2017-04-19 00:21:05
【问题描述】:
我正在尝试构建一个调用 Haskell 函数的简单 C++ 项目(可执行文件), 使用 Shake 作为构建脚本并从脚本中调用 Stack 来构建 Haskell 库。
假设 Haskell 库名为 haskell-simple-lib。
shake 脚本调用stack install haskell-simple-lib 输出.so 文件:libHShaskell-simple-lib-*version*-*unique identifier*.so
我的 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 而不会从名称中删除唯一标识符,但是我需要提前知道.so 文件的名称摇动脚本。
我不明白为什么在运行可执行文件时会搜索原始 .so 文件名。链接标志没有提到stack install 输出的.so 的全名,只有libHShaskell-simple-lib。
可能是原始名称嵌入在 .so 文件中吗?如果是这样,如何解决这个问题?
编辑: 我知道这可以使用虚拟文件来解决,但我想知道是否有更好的方法来做到这一点。
【问题讨论】:
-
您应该运行
stack install,还是运行stack build?您还可以将--copy-bins标志传递给stack,这样它就可以自己复制文件而无需调用摇晃cp。 -
stack build --copy-bins与stack install相同。如果我只使用它而不是cp,则 .so 不会被重命名,并且抖动脚本会失败,如上所述。不过谢谢!
标签: c++ haskell dynamic-linking haskell-stack shake-build-system