【问题标题】:Building a C++ project that links to a Haskell library, using Shake and Stack使用 Shake 和 Stack 构建链接到 Haskell 库的 C++ 项目
【发布时间】: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-binsstack install 相同。如果我只使用它而不是 cp ,则 .so 不会被重命名,并且抖动脚本会失败,如上所述。不过谢谢!

标签: c++ haskell dynamic-linking haskell-stack shake-build-system


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多