这是我想要的用例:
我有一个包含单个模块的包,它可以读取HDF5文件,并将一些数据写入Haskell记录.为了完成这项工作,库使用该bindings-hdf5包.这是我的阴谋集团build-depends. reader-types是我写的一个模块,它定义了包含读入数据的Haskell记录的类型.
build-depends: base >=4.7 && <4.8
, text
, vector
, containers
, bindings-hdf5
, reader-types
Run Code Online (Sandbox Code Playgroud)
请注意,我的cabal文件当前不使用extra-libraries或ghc-options.src/Mabel.hs只要我指定所需的hdf5_hl库,我就可以在ghci中加载我的模块:
ghci src/Mabel.hs -lhdf5_hl -L/long/nixos/path/lib
Run Code Online (Sandbox Code Playgroud)
在ghci中,我可以很好地运行我的功能.
现在,我想要做的是将这个库/模块编译成一个单独的编译文件,稍后我可以在另一个Haskell程序中加载GHC API.通过单个文件,我的意思是即使hdf5_hl系统上不存在库,它也需要运行.优选的是,它也将运行,即使text,vector和/或containers缺失,而是因为这不是必需的reader-types,需要这些类型的反正.使用GHC API加载模块时,我希望它以已编译的形式加载,而不是运行解释.
我这样做的目的是希望自包含文件充当单个预编译的插件文件,稍后由不同的Haskell可执行文件加载和执行.其他插件可能根本不使用hdf5,并且它们保证使用的唯一包是reader-types,它实质上定义了插件接口类型.
我的系统上的HDF5库包含以下文件:libhdf5_la.la,libhdf5_hl.so,libhdf5.la,libhdf5.so,和类似的文件在文件名中的版本号.
我已经做了很多谷歌搜索,但我对所发现的所有边缘情况感到困惑.这里有一些例子,我确定不适合我的情况,或者我不知道.
bindings-hdf5)中指定了绑定.extra-libraries: hdf5_hl或者extra-libraries: hdf5我的cabal文件,并且在两种情况下都产生了.a,.so,.dyn_hi,.dyn_o,.hi,和.o文件dist/build都没有使用完全相同的大小extra-libraries,所以我相信它不能正常工作.cabal我需要对我的文件进行哪些更改才能创建一个自包含的独立文件,以后可以使用GHC API加载?如果不可能,有哪些替代方案?
我也可以使用plugins库加载插件,而不是使用GHC API,但是自包含的要求仍然是相同的.
编辑:我不关心编译的"插件"必须采用什么形式(我假设目标文件是正确的方式),但我想在运行时从单独的可执行文件动态加载它并执行它定义的已知名称和已知的函数类型.我想要单个文件的原因是最终会有其他不同的插件,我希望它们的行为方式相同,而不必担心每个插件的lib路径和依赖关系.编译的单个文件是一个比执行此操作更简单的接口,而不是压缩/解压缩包含Haskell对象代码及其依赖项的存档.