安装程序:我有一个
Haskell库HLib,调用C/C++后端CLib以提高效率.后端小,专门用于HLib.与CLib的接口只能通过HLib暴露; HLib测试,HLib基准测试和依赖于HLib的第三方库不会直接对CLib进行FFI调用.从测试/基准/第三方lib的角度来看,HLib应该纯粹是Haskell.这意味着在例如HLib测试的cabal文件部分中,应该没有对-lCLib,libCLib等的引用,只有构建依赖于HLib,并且可执行文件不应该需要查找动态CLib库.我需要能够构建和运行HLib和第三方库中的所有可执行文件,以及运行cabal repl进行开发.
最初,CLib是用纯C编写的.Caral支持这种情况,我可以通过使用include-dirs,c-sources和include文件中的字段,将CLib以上述方式精确地集成到HLib中.
CLib已经发展成为一个C库,我无法弄清楚如何让小程序轻松集成.相反,我使用自定义构建和Setup.hs的makefile,如this.您可以看到一个这个方法的一个小例子here1,2.
在这个例子中,我无法在HLib中运行cabal repl,因为“不支持加载存档”.这真的意味着我需要一个动态的C库,它很简单,可以创建(在CLib makefile中有一个注释行).但是,如果我做动态C库,由于“没有这样的文件或目录libclib.so”,HLib的测试在运行时失败.这是坏的(除了崩溃),因为测试可执行文件链接到动态库,这不是我想要的.
具体来说,HLib和SimpleLib的测试都应该通过,我应该能够在hlib和simplelib目录中运行cabal repl.
我尝试过的其他事情:this answer,this answer(我无法编译),this和读取the docs(导致“重定位”错误).
我正在使用GHC-7.10.3,尽管如果这在8.0中显得更容易,那没关系.
[1]从lol/challenges简化.
[2]下载并运行./sandBox-init.这构建了HLib(它隐式构建CLib,SimpleLib是依赖于HLib的Haskell库.