ほとんどすべての種類のネイティブ バイナリのコンパイルは、少なくとも 2 つのステップで構成されることに注意してください: 実際のオブジェクトのコンパイル ( .hs
-> .o
) とリンク ( .o
、.a
、.lib
-> 実行可能ファイル/ .exe
/ .so
/.dll
など) 。
これでコンパイルすると:
ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp
...舞台裏で実際に起こっていることは基本的に次のとおりです。
# object compilation - creates algo.o
ghc -c algo.hs -fforce-recomp
# linking - links together algo.o and libHSsomepackage.a into the "algo" binary
# (we assume that `algo.hs` included some module from the package `somepackage`
# e.g. `Data.Package.Some`)
ghc -rtsopts -with-rtsopts=-K32M -o algo -package somepackage algo.o
つまり、この--make
オプションは結果をリンクする前にオブジェクトファイルを自動的にコンパイルするよう GHC に指示し、大量の空白を埋めてくれます。個々のコマンド ライン フラグがどこで終了するかに注意してください。
ファイルの先頭でそのプラグマを指定すると、代わりに次のようになります ( を使用ghc --make algo.hs
):
ghc -c algo.hs -rtsopts -with-rtsopts=-K32M
ghc -o algo -package somepackage algo.o
OPTIONS_GHC
プラグマは、特定のモジュールをオブジェクト ファイルにコンパイルするときに追加するオプションをコンパイラに伝えます。-rtsopts
はリンカ オプションであるため(GHC にコマンド ライン処理の別のセットでリンクするように指示する)、オブジェクト ファイルをコンパイルするときに指定することはできません。リンク時に指定する必要があり、そのようなオプションはモジュールヘッダーには指定できません。
次の 2 つの解決策があります。
- Cabalを使用してビルドし、必要
.cabal
な GHC オプションをファイルに指定します。
- アルゴリズムを修正して、スタック スペースがそれほど必要とならないようにします。たとえば、末尾再帰を使用し、折り畳みをより厳格にします。詳細については、ウィキを参照してください。