首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Haskell项目中使用DLL?

如何在Haskell项目中使用DLL?
EN

Stack Overflow用户
提问于 2015-07-03 07:34:49
回答 3查看 2.1K关注 0票数 44

我想在Haskell项目中使用外部库RDFox

上下文:我正在和Linux64位上工作,使用GHC7.10和堆栈。RDFox是用C++编程的。RDFox共享库(.dll,.so)可以通过Java和Python下载。

目标:--我希望在Haskell项目中重用来自RDFox (.dll,.so)的编译库,因此我需要为RDFox创建一个Haskell包装器。

问题:对于Haskell来说是相对较新的,我很难知道从哪里开始。我找到了关于这个主题的几个页面(来自Haskell和StackOverflow),但是我不清楚工作流程和配置。

问题:我想知道:

  1. 如何将堆栈和阴谋配置为使用外部库、在Windows或Linux上构建(不同的机器、相同的存储库)。
  2. 如何为此外部库上的交互式测试配置GHCi。
  3. 将Python包装器翻译成Haskell是最好的方法吗?我想避免对RDFox C++代码进行分析。
EN

回答 3

Stack Overflow用户

发布于 2016-07-04 15:15:24

  1. 您需要在您的extra-lib-dirs文件的executable部分使用executableextra-libraries,如下所示: 名称: MyApp版本: 0.1.0.0简介:作者: simon.bourne类别:构建类型:>=1.10库公开-模块: HelloWorld构建-依赖:基本>= 4.7 && is;5hs-源-dirs: src默认-语言: Haskell2010可执行的MyApp主-是:Main.hs extra dirs: lib额外库: helloWorld构建-依赖:基>= 4.7 && lib;5,MyApp hs-源-dirs: app默认语言: Haskell2010 将dll和.so放在lib中。请注意,如果在linux上使用静态库(.a而不是.so),您将遇到链接顺序问题。 有关示例,请参见。不要被这个名字所愚弄,因为它可以很好地处理.so文件。
  2. 只要stack ghci能找到你的库(LD_LIBRARY_PATH在linux上),它就能工作。
  3. C API (在对您的问题的评论中提到)已经存在。您只需编写Haskell FFI签名,例如: 国外进口安全"helloWorld“c_helloWorld ::IO () 我强烈建议使用safe调用,不要将函数封装在unsafePerformIO中。 如果您需要传递非不透明结构,您可能需要研究c2hshsc2hs,但我认为您不需要这样做。有关更多细节,请参见此问题
票数 2
EN

Stack Overflow用户

发布于 2016-07-15 15:04:20

您需要为C++ api创建一个C导出的包装器,并将Haskell包装器创建为FFI到C导出的包装器。

在这里描述的C#和Haskell之间的封送:从C#呼叫Haskell

但它与C++和Haskell之间的封送处理非常相似。

例如,创建C++导出函数:

代码语言:javascript
复制
extern "C" __declspec(dllexport) int __cdecl addFive(int number);

extern "C" __declspec(dllexport) int __cdecl addFive(int number)
{
    return number + 5;
}

在Haskell中,您需要导入代码:

代码语言:javascript
复制
foreign import ccall "addFive" addFive :: Int -> Int

然后,您可以使用哈斯克尔中的addFive作为典型的Haskell函数。

对于压缩数据类型(类和结构),需要在Haskell中创建C++数据类型模拟。然后,您需要描述如何封送数据类型从C++到Haskell和从Haskell到C++。

在Haskell中,这意味着您需要为您的数据类型创建可存储实例。

票数 1
EN

Stack Overflow用户

发布于 2016-07-04 04:15:16

来自这份文件的回答

代码语言:javascript
复制
ghc -c Adder.hs
ghc -c StartEnd.c
ghc -shared -o Adder.dll Adder.o Adder_stub.o StartEnd.o
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31201161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档