将C ++库与Haskell库静态链接

克罗基亚

设置:我有一个Haskell库HLib,该可以调用C / C ++后端CLib以提高效率。后端很小,专门用于HLib的接口CLib被通过暴露HLib; HLib测试,HLib基准测试和第三方库(取决于)HLib将不会直接向发出FFI调用CLib从test / benchmark / 3rd party lib的角度来看,HLib应该纯粹是Haskell。这意味着在,例如,小集团文件部分HLib的测试中,应该有任何引用-lCLiblibCLib等等,只有build-dependsHLib,并且可执行文件不应该需要寻找一个动态CLib库。我需要能够在其中构建和运行所有可执行文件HLib和第三方库,以及cabal repl为开发而运行

最初,CLib写于纯C.卡瓦尔具有用于这种情况下的支持,并且我可以集成CLibHLib在精确地,通过使用上面描述的方式include-dirsc-sourcesincludes在小集团文件字段。

CLib已经发展成为一个C ++库,我不知道该如何使Cabal轻松集成。相反,我求助于具有自定义build和Setup.hs的makefile,例如this您可以1,2中看到此方法的一个小示例

在该示例中,我无法运行cabal replHLib因为“不支持加载档案”。这确实意味着我需要一个动态的C ++库,该库创建起来很简单(CLibmakefile中有一个注释行可以做到这一点)。但是,如果我制作了动态C ++库,则HLib由于“没有这样的文件或目录libclib.so” ,该测试在运行时失败。这很糟糕(除了崩溃),因为测试可执行文件链接到了动态库,而这并不是我想要的。

具体而言,对于测试HLibSimpleLib都应该通了,我应该能够运行cabal repl在双方hlibsimplelib目录。

我尝试过的其他操作:这个答案这个答案(我无法编译),这个和阅读文档(导致“重定位”错误)。

我目前正在使用GHC-7.10.3,尽管如果在8.0中明显更方便,那就很好。

[1]大声笑/挑战中简化

[2]下载并运行./sandbox-init这会生成HLib(隐式生成CLibSimpleLib,这是一个依赖于的Haskell库)HLib

克罗基亚

一旦您知道一些技巧,在Haskell库中包含C或C ++库就很简单了。

尽管这篇文章看起来过于复杂,但我从本文中获得了核心您可以将Cabal(当前为1.25)用于Simple构建类型(即没有特殊设置Setup.hs),makefile和诸如的外部工具c2hs

要包含来自纯C库的符号:

  1. 在您的集团文件中,添加Include-dirs: relative/path/to/headers/Includes: relative/path/to/myheader.h
  2. 添加C-sources: relative/path/to/csources/c1.c, relative/path/to/csources/c2.c, etc

C ++还有一些额外的功能:

  1. 您可以将.cpp文件添加C-sourcescabal文件中字段。
  2. .cppHaskell需要访问的文件中的所有函数上,添加extern "C"以避免名称修饰。
  3. 用头文件将所有非纯C代码括起来#ifdef __cplusplus ... #endif(请参见nm的答案)。
  4. 如果您使用标准C ++库,则需要将其添加extra-libraries: stdc++到cabal文件中,并使用g++进行链接ghc-options: -pgmlg++
  5. 如果要进行动态链接(即),则可能需要弄乱在cabal文件中列出文件顺序有关更多信息,请参见此票证.c(pp)cabal repl

而已!您可以在此处看到stack一起使用的完整示例cabal

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将静态库与JNI链接

来自分类Dev

将共享库与静态库链接

来自分类Dev

将静态库链接到共享库

来自分类Dev

与 C 中的静态库链接

来自分类Dev

将C编译的静态库链接到C ++程序

来自分类Dev

如何将C ++静态库链接到C程序?

来自分类Dev

使用CMake将共享库与静态链接

来自分类Dev

将静态库链接到dll

来自分类Dev

将SFML静态库链接到项目

来自分类Dev

是否可以将macfuse链接到C ++静态库?

来自分类Dev

静态库链接,C ++,VS Express 2013

来自分类Dev

C静态库无法与librt链接

来自分类Dev

与CMake链接的C ++动态和静态库

来自分类Dev

静态库链接,C ++,VS Express 2013

来自分类Dev

Android将许多静态库链接到共享库

来自分类Dev

将静态库链接到共享库并隐藏导出的符号

来自分类Dev

使用automake将共享库链接到静态libtool库

来自分类Dev

Android NDK:将静态库与共享库链接

来自分类Dev

创建并链接静态锈库并链接到c

来自分类Dev

将动态链接库合并为一个静态链接库

来自分类Dev

(Visual Studio)尝试将Microsoft库与SFML库静态链接时出现很多链接器错误

来自分类Dev

将程序链接到静态库,将自身链接到另一个库

来自分类Dev

将依赖关系链接到静态库?

来自分类Dev

将依赖关系链接到静态库?

来自分类Dev

将 libssh 与静态库(libssh.a)链接起来

来自分类Dev

Linux:C / C ++标准库静态与动态链接

来自分类Dev

使用gcc在C中链接C ++静态库

来自分类Dev

使用gcc在C中链接C ++静态库

来自分类Dev

链接器如何处理链接到共享库的C ++静态库的唯一typeinfo约束?