5

我正在尝试针对某些 C++ 源构建带有 FFI 的 Haskell 可执行文件。

我有一个像这样的 C 头文件(cstuff/foo.h):

#ifndef _FOO_H_
#define _FOO_H_

#include <somecppheader.c> // Some header outside of my control with C++ constructs

void foo();

#endif

foo 的实现应该无关紧要。它会做一些事情并使用 somecppheader.h 中声明的东西。

Cabal 文件中的可执行部分如下所示:

executable botprog
  main-is:             Main.hsc
  other-extensions:    ForeignFunctionInterface
  build-depends:       base >=4.7 && <4.8
  build-tools:         hsc2hs
  default-language:    Haskell2010
  include-dirs:        cstuff
  c-sources:           cstuff/foo.cpp
  pkgconfig-depends:   somelib -- The one that contains somecppheader.h

Main.hsc 看起来像这样:

{-# LANGUAGE ForeignFunctionInterface #-}

#include <foo.h>
foreign import ccall "foo.h foo" :: IO ()

main = foo >> putStrLn "Called foo."

在这个例子中实际上不需要 hsc2hs,它只是用来触发我试图描述的错误。

问题是 somecppheader.h 是具有 C++ 特定构造的 C++ 头文件,而 foo.h 的包含似乎将其编译为 C 头文件,但由于 C++ 构造(如类定义)而失败。

我如何告诉 hsc2hs 或 Cabal foo.h 需要用 g++ 而不是 gcc 编译?

4

0 回答 0