Редактировать: Вы также должны увидеть ответ Томера ниже. Мой ответ здесь описывает теорию происходящего, но у меня могут быть неполные детали исполнения, тогда как его ответ - полный рабочий пример.
Как указывает sclv, компиляция не должна быть проблемой. Сложность, вероятно, заключается в связывании кода C ++, и здесь у вас возникнут небольшие трудности с подключением всех необходимых библиотек времени выполнения. Проблема заключается в том, что программы на Haskell должны быть связаны с библиотеками времени выполнения Haskell и C ++. Программы должны быть связаны с библиотеками времени выполнения C ++. На странице Wiki вы ссылаетесь, когда они делают
$ ghc -optc -O test.c A.o A_stub.o -o test
для компиляции C-программы, которая фактически выполняет два шага: компилирует C-программу в объектный файл, а затем связывает ее вместе. Выписано, это было бы что-то вроде (вероятно, не совсем верно, так как я не говорю на GHC):
$ ghc -c -optc-O test.c -o test.o
$ ghc test.o A.o A_stub.o -o test
GHC просто действует как GCC (и, IIUC, функционально - это GCC) при компиляции C-программы. Однако при его связывании он отличается от того, что происходит, если вы вызываете GCC напрямую, поскольку он также волшебным образом включает библиотеки времени выполнения на Haskell. G ++ работает аналогично для программ на C ++ - когда он используется в качестве компоновщика, он включает библиотеки времени выполнения C ++.
Итак, как я уже говорил, вам нужно скомпилировать таким образом, чтобы он связывался с обеими библиотеками времени выполнения. Если вы запускаете G ++ в подробном режиме для компиляции и компоновки программы, например:
$ g++ test.cpp -o test -v
создаст длинный список вывода о том, что он делает; в конце будет строка вывода, где он выполняет связывание (с подпрограммой collect2
), указывающее, на какие библиотеки он ссылается. Вы можете сравнить это с выводом для компиляции простой программы на C, чтобы увидеть, что отличается для C ++; в моей системе это добавляет -lstdc++
.
Таким образом, вы должны быть в состоянии скомпилировать и связать вашу смешанную программу на Haskell / C ++ следующим образом:
$ ghc -c -XForeignFunctionInterface -O A.hs # compile Haskell object file.
$ g++ -c -O test.cpp # compile C++ object file.
$ ghc A.o A_stub.o test.o -lstdc++ -o test # link
Там, поскольку вы указали -lstdc++
, он будет включать библиотеку времени выполнения C ++ (при условии, что -l
- правильный синтаксис GHC; вам нужно будет проверить), а также потому, что вы связались с ghc
, он будет включать библиотеку времени выполнения Haskell. Это должно привести к рабочей программе.
Кроме того, вы должны быть в состоянии сделать что-то похожее на -v
исследование вывода с помощью GHC и выяснить, на какую библиотеку времени исполнения (или библиотеки) Haskell она ссылается для поддержки Haskell, а затем добавить эту библиотеку при компоновке вашей программы. с C ++, как вы уже делаете для чистых программ на C ++. (Подробности об этом см. В ответе Томера, поскольку он так и сделал.)