微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将C库与Haskell库静态链接

安装程序:我有一个 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库.

解决方法

GHC不能真正理解C头文件.它需要纯C代码. C头文件提供C接口的通用方法是使用#ifdef __cplusplus隔离C部分,例如:
#ifdef __cplusplus
extern "C" {         // C compilers and varIoUs C-based FFIs don't like this
#endif

void foo();

#ifdef __cplusplus
}
#endif

此外,GHCi在历史上已知具有连接C代码的问题.例如,在某种程度上,它不了解弱符号(通常由编译器与内联函数和模板实例化相结合).您可能会看到其中一个问题.我建议向GHC团队提交错误报告.

原文地址:https://www.jb51.cc/c/115998.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐