C++ 建设一个C++;使用Shake和Stack链接到Haskell库的项目

C++ 建设一个C++;使用Shake和Stack链接到Haskell库的项目,c++,haskell,dynamic-linking,haskell-stack,shake-build-system,C++,Haskell,Dynamic Linking,Haskell Stack,Shake Build System,我试图建立一个简单的C++项目(一个可执行文件),调用一个Haskell函数, 对构建脚本使用Shake并从脚本中调用Stack来构建Haskell库 假设Haskell库被称为Haskell简单库 shake脚本调用stack install haskell simple lib,输出一个.so文件:libHShaskell simple lib-*版本*-*唯一标识符*。so 我的Shake规则取决于文件名,因此我不能使用前面提到的名称,因为我事先不知道唯一标识符是什么。因此,Shake脚本

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

假设Haskell库被称为
Haskell简单库

shake脚本调用
stack install haskell simple lib
,输出一个
.so
文件:
libHShaskell simple lib-*版本*-*唯一标识符*。so

我的Shake规则取决于文件名,因此我不能使用前面提到的名称,因为我事先不知道唯一标识符是什么。因此,Shake脚本在文件上运行一个
cp
\u build/libHShaskell simple lib.so

<> > C++可执行文件的链接选项有<代码> -LYBug 和LaskelSimple LIB < /C> > < /P> 当我尝试运行可执行文件时,会出现一个错误,提示:

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
但是,如果我将复制到
\u build
的文件重命名为
stack install
输出的原始名称(具有唯一标识符的文件),可执行文件将正确运行

有人会认为我所需要做的就是简单地
cp
文件
\u build
,而不删除名称中的唯一标识符,但是我需要知道
的名称。因此,对于shake脚本,我需要提前知道
文件

我不明白为什么在运行可执行文件时,会搜索原始文件名。link标志没有提到
的全名。因此
堆栈安装
只输出
libHShaskell简单库
。 是否原始名称嵌入了.so文件中?如果是这样,如何着手解决这个问题

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

原始标识符嵌入在
中。所以
。我不记得所有的细节,但我知道我在过去使用twiddling解决了这些问题。

您应该运行
stack install
,还是
stack build
?您还可以将
--copy bins
标志传递到
stack
,这样它就可以自己复制文件而无需调用shake
cp
stack build--copy bins
stack install
相同。如果我只使用它而不是
cp
so,则不会重命名.so,并且shake脚本会失败,如上所述。但是谢谢!