2011-11-13 92 views
3

GHC錯誤我試圖編譯和使用GHC鏈接簡單的程序,但在連接過程中失敗了:與系統上的OS X Lion的

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 

一切正常(除噸LD警告)

有關環境的一些更多的信息:

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

從哈斯克爾平臺的Mac OS X 10.6(英特爾32位GHC)

系統:最大OS X獅子10.7.2

任何想法怎麼了?

(順便說一句,我試圖安裝HP 64位,但在安裝過程中失敗)

回答

3

也許是因爲你使用的系統的東西嗎? ghc --make可能會自動檢測到它需要鏈接的Haskell庫,並且它本身不會。

5

邁克爾在歷史上是對的。由於--make,ghc會自行判斷它必須使用哪些軟件包並鏈接(除非兩個已安裝的軟件包公開了相同的模塊名稱,然後無法確定使用哪一個軟件包),而不必使用--make,您必須告訴它。但是,從7.0開始,--make是ghc的默認模式,所以普通ghc Main.hs現在與ghc --make Main.hs相同。這裏的區別是兩步編譯。我不知道確切的細節,但原因是模塊System在haskell98包(提議,請使用分層模塊,getArgs應該通過System.Environment導入,從7.2開始,haskell98不能是與基地一起使用),默認情況下未連接。因此,ghc -o Main Main.o在默認包中找不到該符號。你必須明確地告訴它看看haskell98包,ghc -c -O Main.hs; ghc -package haskell98 -o Main Main.o應該工作(並且它在這裏工作,我用7.0.4測試以確保)。