真实世界Haskell,第5章,SimpleJSON编译错误
据英国《每日邮报》报道,现实世界中哈斯克尔的部分内容现在已经过时。我只讲了第5章,但我在将一个简单的示例编译为可执行二进制文件时遇到了问题 给出了两个模块:真实世界Haskell,第5章,SimpleJSON编译错误,haskell,ghc,Haskell,Ghc,据英国《每日邮报》报道,现实世界中哈斯克尔的部分内容现在已经过时。我只讲了第5章,但我在将一个简单的示例编译为可执行二进制文件时遇到了问题 给出了两个模块: module SimpleJSON ( JValue(..) , getString , getInt , getDouble , getBool , getObject , getArray , isNull ) where data JValue =
module SimpleJSON
(
JValue(..)
, getString
, getInt
, getDouble
, getBool
, getObject
, getArray
, isNull
) where
data JValue = JString String
| JNumber Double
| JBool Bool
| JNull
| JObject [ (String, JValue) ]
| JArray [ JValue ]
deriving (Eq, Ord, Show)
getString :: JValue -> Maybe String
getString (JString s) = Just s
getString _ = Nothing
getInt (JNumber n) = Just (truncate n)
getInt _ = Nothing
getDouble (JNumber n) = Just n
getDouble _ = Nothing
getBool (JBool b) = Just b
getBool _ = Nothing
getObject (JObject o) = Just o
getObject _ = Nothing
getArray (JArray a) = Just a
getArray _ = Nothing
isNull v = v == JNull
及
按照先编译SimpleJSON对象文件的说明:
$ ghc -c SimpleJSON.hs
然后链接可执行文件:
$ ghc -o simple Main.hs SimpleJSON.o
这将导致一个错误,说明未导出“main”:
[2 of 2] Compiling Main ( Main.hs, Main.o )
Main.hs:1:1:
The main function `main' is not exported by module `Main'
但是,如果我将main
添加到导出列表或忽略空的导出列表,我会在链接阶段看到许多多个定义错误:
Linking simple ...
SimpleJSON.o:(.data+0x0): multiple definition of `__stginit_SimpleJSON'
./SimpleJSON.o:(.data+0x0): first defined here
SimpleJSON.o:(.data+0x0): multiple definition of `SimpleJSON_getArray_closure'
./SimpleJSON.o:(.data+0x0): first defined here
....
(.text+0x2d40): multiple definition of `SimpleJSON_JObject_static_info'
./SimpleJSON.o:(.text+0x2d40): first defined here
SimpleJSON.o: In function `SimpleJSON_JArray_info':
(.text+0x2d80): multiple definition of `SimpleJSON_JArray_static_info'
./SimpleJSON.o:(.text+0x2d80): first defined here
collect2: error: ld returned 1 exit status
假设此错误是由文本中显示的过时代码或过时ghc接口导致的,那么编译此SimpleJSON示例的正确方法是什么?这应该可以:
ghc -o simple Main.hs SimpleJSON.hs
ghc -c SimpleJSON.hs
ghc -c Main.hs
ghc -o simple Main.o SimpleJSON.o
或者类似的东西也应该起作用:
ghc -o simple Main.hs SimpleJSON.hs
ghc -c SimpleJSON.hs
ghc -c Main.hs
ghc -o simple Main.o SimpleJSON.o
或者,正如@chi所指出的,您可以使用:
ghc --make SimpleJSON.hs Main.hs
谢谢你,西比。这两个例子似乎都有效。尽管第二个存在一个小问题,但编译Main依赖于SimpleJSON的接口文件。简单地交换订单对我来说就行了。也要感谢迟浩田<代码>--make看起来是ghc提供的一个非常强大的工具!