Calling Haskell from c++



我正在尝试从c ++调用Haskell。

我试图使用这个解释;并且已经问了一个关于SO的问题。

但是,我没有任何答案,所以我想重新表述为一个最小、完整和可验证的示例。

正在使用 Debian,这就是我所拥有的(在同一个文件夹中(:

C++:

// main.cpp
#include <iostream>
#include "Hello_stub.h"
int main(int argc, char** argv) {
  hs_init(&argc, &argv);
  std::cout << "Hello from C++n";
  helloFromHaskell();
  hs_exit();
  return 0;
}

哈斯克尔:

// hello.hs
module Hello where
foreign export ccall helloFromHaskell :: IO ()
helloFromHaskell :: IO ()
helloFromHaskell = putStrLn "Hello from Haskell"

制作文件:

CPP_SOURCES = main.cpp
HASKELL_SOURCES = Hello.hs
CFLAGS = -Wall -g -fno-stack-protector
HFLAGS = -fforce-recomp
all: main; ./main
main: $(CPP_SOURCES) HaskellPart; g++ 
    $(CFLAGS) -o main $(CPP_SOURCES) Hello.o 
    -I/usr/lib/ghc/include 
    -liconv 
    -I/usr/lib/ghc/ghc-8.0.1/include 
    -L/usr/lib/ghc/ghc-8.0.1 
    -L/usr/lib/ghc/base-4.9.0.0 
    -lHSbase-4.9.0.0 
    -L/usr/lib/ghc/ghc-prim-0.5.0.0 
    -lHSghc-prim-0.5.0.0 
    -L/usr/lib/ghc/integer-gmp-1.0.0.1 
    -lHSinteger-gmp-1.0.0.1 
    -lHSghc-prim-0.5.0.0 
    -L/usr/lib/ghc/rts 
    -lHSrts 
HaskellPart: $(HASKELL_SOURCES); ghc $(HFLAGS) $(HASKELL_SOURCES)
clean: ; rm -rf main && rm -rf *.o && rm -rf *.hi && rm -rf *_stub.h

这是输出。似乎是一堆形式的错误

/usr/bin/ld: Hello.o: relocation R_X86_64_32S against symbol `stg_bh_upd_frame_info' can not be used when making a shared object; recompile with -fPIC

怎么了?感谢您的帮助!

不确定这是否真的在您的文件中,或者它是否只是在您放入问题但"//hello.hs"无法编译的版本中。评论是 - 在哈斯克尔而不是//。

无论如何,进入有趣的部分...

首先,您需要将 HsFFI.h 头文件导入到C++代码中。

#include <iostream>
#include "Hello_stub.h"
#include <HsFFI.h>

然后在编译文件后使用 ghc 链接文件。打开命令提示符/终端并导航包含C++和 Haskell 文件的目录。然后运行以下命令:

ghc -c -XForeignFunctionInterface -O hello.hs
g++ -c -O main.cpp -I "C:Program FilesHaskell Platform7.10.3libinclude"                         
ghc -no-hs-main hello.o main.o -lstdc++

第二个命令中的文件路径指向包含 HsFFI.h 文件的目录。

运行主然后输出:

Hello from C++
Hello from Haskell

相关内容

  • 没有找到相关文章

最新更新