繁体   English   中英

使用Shake和Stack构建链接到Haskell库的C ++项目

[英]Building a C++ project that links to a Haskell library, using Shake and Stack

我正在尝试构建一个简单的C ++项目(可执行文件),该项目调用Haskell函数,使用Shake作为构建脚本,并从脚本内部调用Stack来构建Haskell库。

假设Haskell库称为haskell-simple-lib

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

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

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输出的原始名称(具有唯一标识符的文件), _build执行文件将正确运行。

有人会认为,我要做的就是简单地将文件cp _build而不擦除名称中的唯一标识符,但是对于摇动脚本,我需要提前知道.so文件的名称。

我不明白为什么在运行可执行文件时会搜索原始的.so文件名。 链接标志没有提到.so的全名,因此输出的是stack install ,只有libHShaskell-simple-lib 原始名称是否可以嵌入.so文件中? 如果是这样,如何解决这个问题?

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

原始标识符嵌入在.so 我不记得所有的细节,但我确实知道我过去使用rpath twiddling解决了此类问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM