OS X Lion上的System出现GHC错误

时间:2011-11-13 01:53:22

标签: macos haskell 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

一切正常(除了大量的ld警告)

有关环境的更多信息:

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

来自适用于Mac OS X 10.6的Haskell平台(英特尔,32位GHC)

系统:Max OS X Lion 10.7.2

任何想法有什么不对?

(顺便说一句,我尝试安装HP x64,但在安装过程中失败了)

2 个答案:

答案 0 :(得分:5)

迈克尔在历史上是正确的。使用--make,ghc确定它必须使用哪些包并自行链接(除非两个已安装的包显示相同的模块名称,然后它无法确定使用哪个包),而不是{{ 1}},你必须告诉它。但是,从7.0开始,--make是ghc的默认模式,因此普通--make现在与ghc Main.hs相同。这里的区别是两步编译。我不知道确切的细节,但原因是模块ghc --make Main.hs在haskell98包中(请使用分层模块,getArgs应该通过System.Environment导入,截至7.2 ,haskell98不能与base一起使用),默认情况下没有链接。因此System在默认包中找不到符号。您必须明确告诉它查看haskell98软件包,ghc -o Main Main.o应该有效(并且它在这里工作,我已经使用7.0.4进行了测试以确保)。

答案 1 :(得分:3)

也许是因为你正在使用系统中的东西? ghc --make可能会自动检测需要链接的Haskell库,ghc本身不会。