Я пытаюсь позвонить на Haskell с C ++.
Я пытался использовать этот объяснение; и уже задал один вопрос ТАК.
Однако у меня нет никакого ответа, поэтому я бы хотел переформулировать пример Minimal, Complete и Verifiable.
Я использую 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
Вот выход. Вроде бы куча ошибок вида
/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 Files\Haskell Platform\7.10.3\lib\include"ghc -no-hs-main hello.o main.o -lstdc++
Путь к файлу во второй команде находится в каталоге, содержащем файл HsFFI.h.
Запустив основной, затем вывод:
Hello from C++
Hello from Haskell
Других решений пока нет …