我想从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;
}
Haskell:
// hello.hs
module Hello where
foreign export ccall helloFromHaskell :: IO ()
helloFromHaskell :: IO ()
helloFromHaskell = putStrLn "Hello from Haskell"
MakeFile:
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
这里是output。看起来是一堆形式为错误的东西。
/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
有什么问题吗?谢谢你的帮助!
ghc
用作链接器。这样,您就不需要对所有-L
进行设置了。例如:g++ -c main.cpp; ghc Hello.hs main.o -o main
或类似命令。 - luquiHaskellPart.o
,但是没有HaskellPart.hs
。而且Hello.o
在g++
命令行上,尽管表面上需要HaskellPart.o
。清空你的项目目录,然后再试一次(这样你就不会被过时的目标文件误导了)。此外,-c
不应该在ghc
命令行上吗? - luqui