编辑:您还应该在下面看到 Tomer 的回答。我在这里的回答描述了正在发生的事情的理论,但我可能有一些执行细节不完整,而他的回答是一个完整的工作示例。
正如 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 在编译 C 程序时就像 GCC(并且,IIUC,在功能上是 GCC)。但是,在链接它时,它与直接调用 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 运行时库。这应该会产生一个工作程序。
或者,您应该能够使用 GHC 执行类似于 -v 输出调查的操作,并找出它链接到的 Haskell 运行时库(或库)以支持 Haskell,然后在链接您的程序时添加该库使用 C++,就像对纯 C++ 程序所做的那样。 (有关详细信息,请参阅 Tomer 的回答,因为他就是这样做的。)