Я пытаюсь построить исполняемый файл Haskell с FFI против некоторых источников C ++.
У меня есть заголовок 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?
Задача ещё не решена.