我想在Haskell项目中使用外部库RDFox。
上下文:我正在和Linux64位上工作,使用GHC7.10和堆栈。RDFox是用C++编程的。RDFox共享库(.dll,.so)可以通过Java和Python下载。
目标:--我希望在Haskell项目中重用来自RDFox (.dll,.so)的编译库,因此我需要为RDFox创建一个Haskell包装器。
问题:对于Haskell来说是相对较新的,我很难知道从哪里开始。我找到了关于这个主题的几个页面(来自Haskell和StackOverflow),但是我不清楚工作流程和配置。
问题:我想知道:
发布于 2016-07-04 15:15:24
extra-lib-dirs文件的executable部分使用executable和extra-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文件。stack ghci能找到你的库(LD_LIBRARY_PATH在linux上),它就能工作。safe调用,不要将函数封装在unsafePerformIO中。
如果您需要传递非不透明结构,您可能需要研究c2hs或hsc2hs,但我认为您不需要这样做。有关更多细节,请参见此问题。发布于 2016-07-15 15:04:20
您需要为C++ api创建一个C导出的包装器,并将Haskell包装器创建为FFI到C导出的包装器。
在这里描述的C#和Haskell之间的封送:从C#呼叫Haskell
但它与C++和Haskell之间的封送处理非常相似。
例如,创建C++导出函数:
extern "C" __declspec(dllexport) int __cdecl addFive(int number);
extern "C" __declspec(dllexport) int __cdecl addFive(int number)
{
return number + 5;
}在Haskell中,您需要导入代码:
foreign import ccall "addFive" addFive :: Int -> Int然后,您可以使用哈斯克尔中的addFive作为典型的Haskell函数。
对于压缩数据类型(类和结构),需要在Haskell中创建C++数据类型模拟。然后,您需要描述如何封送数据类型从C++到Haskell和从Haskell到C++。
在Haskell中,这意味着您需要为您的数据类型创建可存储实例。
发布于 2016-07-04 04:15:16
来自这份文件的回答
ghc -c Adder.hs
ghc -c StartEnd.c
ghc -shared -o Adder.dll Adder.o Adder_stub.o StartEnd.ohttps://stackoverflow.com/questions/31201161
复制相似问题