[英]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.