我尝试使用ghc编译和链接简单程序,但在链接期间失败:
import System (getArgs)
main = do
args <- getArgs
print args
Run Code Online (Sandbox Code Playgroud)
我试着编译
% 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
Run Code Online (Sandbox Code Playgroud)
但是,在使用--make进行编译时:
% ghc --make Main.hs
Run Code Online (Sandbox Code Playgroud)
一切正常(除了大量的ld警告)
关于环境的更多信息:
% ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.0.3
Run Code Online (Sandbox Code Playgroud)
来自适用于Mac OS X 10.6的Haskell平台(英特尔,32位GHC)
系统:Max OS X Lion 10.7.2
有什么想法有什么不对吗?
(顺便说一句,我尝试安装HP x64,但在安装过程中失败了)
迈克尔在历史上是正确的.有了--make,ghc会确定它必须使用哪些软件包并自行链接(除非两个已安装的软件包显示相同的模块名称,然后它无法确定使用哪个软件包),否则--make,您必须告诉它.但是,从7.0开始,--make是ghc的默认模式,所以plain 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测试,以确保).
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |