我尝试使用 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,但在安装过程中失败了)
最佳答案
迈克尔在历史上是正确的。使用 --make
,ghc 确定它必须使用哪些包并自行链接(除非两个已安装的包公开相同的模块名称,否则它无法确定使用哪个),没有 --make
,您必须告诉它。但是,从 7.0 开始, --make
是 ghc 的默认模式,因此普通 ghc Main.hs
现在与 ghc --make Main.hs
相同。这里的区别是两步编译。我不知道确切的细节,但原因是模块System
在haskell98包中(建议使用分层模块,getArgs应该通过System.Environment导入,从7.2开始,haskell98不能与 base 一起使用),默认情况下不链接。因此 ghc -o Main Main.o
在默认包中找不到该符号。你必须明确告诉它查看 haskell98 包,ghc -c -O Main.hs; ghc -package haskell98 -o Main Main.o
应该可以工作(它在这里工作,我已经用 7.0.4 进行了测试以确保)。
关于macos - OS X Lion 系统上的 GHC 错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8109025/