我正在尝试从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