设置:我有一个Haskell库HLib,用于提高效率调用C/C++后端CLib。后端非常小且专门用于与HLib一起使用。CLib的接口将仅通过HLib公开;从测试/基准测试/第三方库的角度来看,HLib应该是纯Haskell的。这意味着在cabal文件章节中,例如HLib测试,不应引用-lCLib、libCLib等内容,只需在build-depends上依赖HLib,并且可执行文件不需要查找动态CLib库。我需要能够构建和运行HLib和第三方库中的所有可执行文件,并进行开发时的cabal repl。
具体来说,HLib和SimpleLib的测试都应该通过,并且我应该能够在hlib和simplelib目录中运行cabal repl。
原本,CLib
是用纯C编写的。Cabal支持这种情况,我可以通过在 cabal 文件中使用 include-dirs
、c-sources
和 includes
字段以与上述方式精确地将 CLib
集成到 HLib
中。
CLib
已经发展成为一个 C++ 库,我无法轻松地让 cabal 集成它。相反,我采用了自定义构建和 Setup.hs 的 makefile,类似于 this。您可以在 here1,2 中看到此方法的简单示例。
具体来说,HLib和SimpleLib的测试都应该通过,并且我应该能够在hlib和simplelib目录中运行cabal repl。
我尝试过其他方法:这个答案,这个答案(我无法编译),这个,以及阅读文档(导致“重定位”错误)。
目前我使用的是GHC-7.10.3,但如果在8.0中更容易解决,那也可以。
[1] 简化自lol/challenges。
[2]下载并运行./sandbox-init
。 这将构建HLib
(该库会隐式地构建CLib
和依赖于HLib
的Haskell库SimpleLib
)。
#ifdef __cplusplus
进行隔离。如果您能给我一个纯 C 的工作示例,我认为我将能够在不太费力的情况下将其转换为 C++。 - n. m.#ifdef
确实使cabal configure
步骤顺利进行。这使我能够使用cabal使用此处的说明链接C ++。不幸的是,对于更复杂的示例,我仍然无法运行cabal repl
。这可能是GHC或cabal的错误,但我仍在努力解决。更长的解释和更多示例请参见存储库(请参阅README)。 - crockeea