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++ 構造のために失敗します。

foo.h を gcc ではなく g++ でコンパイルする必要があることを hsc2hs または Cabal に伝えるにはどうすればよいですか?

4

0 に答える 0