C++ 建设一个C++;使用Shake和Stack链接到Haskell库的项目
我试图建立一个简单的C++项目(一个可执行文件),调用一个Haskell函数, 对构建脚本使用Shake并从脚本中调用Stack来构建Haskell库 假设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脚本
Haskell简单库
shake脚本调用stack install haskell simple lib
,输出一个.so
文件:libHShaskell simple lib-*版本*-*唯一标识符*。so
我的Shake规则取决于文件名,因此我不能使用前面提到的名称,因为我事先不知道唯一标识符是什么。因此,Shake脚本在文件上运行一个cp
\u build/libHShaskell simple lib.so
<> > C++可执行文件的链接选项有<代码> -LYBug 和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
,这样它就可以自己复制文件而无需调用shakecp
,stack build--copy bins
与stack install
相同。如果我只使用它而不是cp
so,则不会重命名.so,并且shake脚本会失败,如上所述。但是谢谢!