Max*_*AST 8 c++ haskell g++ ghc
我试图从c ++调用Haskell.
但是,我没有得到任何答案,所以我想重新制定一个最小的,完整的,可验证的例子.
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
哈斯克尔:
// hello.hs
module Hello where
foreign export ccall helloFromHaskell :: IO ()
helloFromHaskell :: IO ()
helloFromHaskell = putStrLn "Hello from Haskell"
Run Code Online (Sandbox Code Playgroud)
生成文件:
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
Run Code Online (Sandbox Code Playgroud)
这是输出.这似乎是一堆形式的错误
/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
Run Code Online (Sandbox Code Playgroud)
怎么了?谢谢您的帮助 !
不确定这是否确实在您的文件中,或者是否只是您在问题中放入的版本,但“// hello.hs”将无法编译。Haskell 中的注释是 -- 而不是 //。
无论如何,到了有趣的部分......
首先,您需要将 HsFFI.h 头文件导入到 C++ 代码中。
#include <iostream>
#include "Hello_stub.h"
#include <HsFFI.h>
Run Code Online (Sandbox Code Playgroud)
编译后使用 ghc 链接文件。打开命令提示符/终端并导航包含 C++ 和 Haskell 文件的目录。然后运行以下命令:
ghc -c -XForeignFunctionInterface -O hello.hs
g++ -c -O main.cpp -I "C:\Program Files\Haskell Platform\7.10.3\lib\include"
ghc -no-hs-main hello.o main.o -lstdc++
Run Code Online (Sandbox Code Playgroud)
第二个命令中的文件路径是包含 HsFFI.h 文件的目录。
运行 main 然后输出:
Hello from C++
Hello from Haskell
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |