Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何静态地将一个C库编译成一个Haskell模块,以便稍后使用GHCAPI加载?_Haskell_Ghc_Cabal - Fatal编程技术网

如何静态地将一个C库编译成一个Haskell模块,以便稍后使用GHCAPI加载?

如何静态地将一个C库编译成一个Haskell模块,以便稍后使用GHCAPI加载?,haskell,ghc,cabal,Haskell,Ghc,Cabal,下面是我想要的用例: 我有一个带有单个模块的包,它可以读取HDF5文件并将它们的一些数据写入Haskell记录。为了完成这项工作,库使用了bindings-hdf5包。这是我的阴谋集团的构建取决于读取器类型是我编写的一个模块,它定义了包含读入数据的Haskell记录的类型 build-depends: base >=4.7 && <4.8 , text , vector

下面是我想要的用例:

我有一个带有单个模块的包,它可以读取HDF5文件并将它们的一些数据写入Haskell记录。为了完成这项工作,库使用了
bindings-hdf5
包。这是我的阴谋集团的
构建取决于
<代码>读取器类型是我编写的一个模块,它定义了包含读入数据的Haskell记录的类型

build-depends:         base >=4.7 && <4.8
                     , text
                     , vector
                     , containers
                     , bindings-hdf5
                     , reader-types
在ghci中,我可以完美地运行我的函数

现在,我要做的是将这个库/模块编译成一个单独的已编译文件,稍后我可以用GHCAPI加载到另一个Haskell程序中。单文件的意思是,即使系统上不存在
hdf5\u hl
库,它也需要运行。最好,即使缺少
文本
向量
、和/或
容器
,它也会运行,但这不是必需的,因为
读取器类型
无论如何都需要这些类型。当用GHCAPI加载模块时,我希望它以已经编译的形式加载,而不是运行解释

我这样做的目的是希望这个自包含文件充当一个单独的、预编译的插件文件,稍后由另一个Haskell可执行文件加载和执行。其他插件可能根本不使用hdf5,它们保证使用的唯一软件包是
读卡器类型
,它本质上定义了插件接口类型

我的系统上的hdf5库包含以下文件:
libhdf5_la.la
libhdf5_hl.so
libhdf5.la
libhdf5.so
,以及文件名中包含版本号的类似文件

我在谷歌上做了很多搜索,但我发现的所有边缘案例都让我感到困惑。这里有一些例子,我肯定不适合我的情况,或者我说不出来

  • 我不想,只是一个使用GHCAPI的Haskell程序
  • 我不想这样做,因为绑定已经存在,并且库已经是一个C库
  • 我不想编译一个库,因为我用GHCAPI加载它,所以我不需要库中包含GHC运行时。(我的理解是,插件必须使用在GHCAPI中加载的相同ghc版本进行编译)
  • 我不想这样做,因为C库已经编译,绑定在单独的包中指定(
    bindings-hdf5
  • 我想做的最接近的资源是2009年的邮件列表。但是,我将
    额外库:hdf5_hl
    额外库:hdf5
    添加到我的cabal文件中,在这两种情况下,
    dist/build
    中生成的.a、.so、.dyn_hi、.dyn_o、.hi和.o文件的大小都与未使用
    额外库时的大小完全相同,因此我确信它不能正常工作
我需要对我的
cabal
文件做哪些更改才能创建一个独立的文件,以便以后使用GHC API加载?如果这是不可能的,有什么替代方案

除了使用GHCAPI之外,我还愿意使用库来加载插件,但自包含的要求仍然是一样的


编辑:我不关心编译后的“插件”必须采用什么形式(我假设对象文件是正确的方式),但我希望在运行时从单独的可执行文件动态加载它,并执行它使用已知名称和已知类型定义的函数。我想要一个文件的原因是最终会有其他不同的插件,我希望它们都以相同的方式运行,而不必担心每个插件的库路径和依赖性。与压缩/解压包含Haskell对象代码及其依赖项的归档文件相比,编译后的单个文件是一个更简单的界面。

您想要一个单个对象文件,还是一个静态链接的可执行文件?在后一种情况下,只需将
-optl static
传递给ghc就可以了。在前一种情况下,我不确定您为什么要这样做,因为您没有理由不在库中包含“hdf5_hl”和其他依赖项(当然,许可证允许)。@user2407038我编辑了这个问题以进一步解释。谢谢
ghci src/Mabel.hs -lhdf5_hl -L/long/nixos/path/lib