2011-11-13 13 views
3

私はGHCを使って簡単なプログラムをコンパイルしてリンクしようとしたが、それはリンク時に失敗しました:GHCエラー

import System (getArgs) 

main = do 
    args <- getArgs 
    print args 

私はとき、しかし、

% ghc -c -O Main.hs 
% ghc -o Main Main.o 
ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog 
Undefined symbols for architecture i386: 
    "___stginit_haskell98zm1zi1zi0zi1_System_", referenced from: 
     ___stginit_Main_ in Main.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
zsh: exit 1  ghc -o Main Main.o 

でコンパイルしてみました--makeでコンパイル:

% ghc --make Main.hs 

すべてが

0(LD警告のトンのほかに)動作します

環境に関するいくつかの詳細情報:

% ghc --version 
The Glorious Glasgow Haskell Compilation System, version 7.0.3 

HaskellのプラットフォームからのMac OS X 10.6(インテル、32ビットGHC)

システムについて:マックスOS Xライオン10.7.2

任意のアイデアどうしましたか?

(ところで、私はHPのx64のをインストールしようとしたが、それは、インストール時に失敗した)

答えて

3

あなたは、システムから何かを使用しているので、おそらくそれはですか? ghc --makeはおそらく、リンクする必要のあるHaskellライブラリを自動的に検出し、ghcはそれ自身では検出しません。

5

マイケルは歴史的に正しいです。 --makeでは、ghcはどのパッケージを使用し、それ自身でリンクしなければならないかを把握しています(インストールされた2つのパッケージが同じモジュール名を公開していない場合は、どちらを使用するか分かりません)。しかし、7.0の時点では--makeがghcのデフォルトモードです。したがって、ghc Main.hsは現在ghc --make Main.hsと同じです。違いは二段階コンパイルです。私は正確な詳細はわかりませんが、原因は、モジュールSystemがhaskell98パッケージに含まれているということです(提案、階層モジュールを使用してください、getArgsはSystem.Environment経由でインポートする必要があります。 baseと一緒に使用されます)。既定ではリンクされていません。したがって、ghc -o Main Main.oはデフォルトパッケージでシンボルを検索しません。あなたは明示的にhaskell98パッケージを見て、ghc -c -O Main.hs; ghc -package haskell98 -o Main Main.oが動作するはずです(そして、ここで動作します、私は確かめるために7.0.4でテストしました)。