Real World Haskell, Chapter 5, SimpleJSON compile error
According to another question, parts of Real World Haskell are now obsolete. I'm only on Chapter 5, but I'm having problems compiling a simple example to an executable binary.
Two modules are given:
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
and
module Main () where
import SimpleJSON
main = print (JObject [ ("foo", JNumber 1), ("bar", JBool False ) ])
with instructions to compile a SimpleJSON object file first:
$ ghc -c SimpleJSON.hs
followed by linking the executable:
$ ghc -o simple Main.hs SimpleJSON.o
which results in an error stating that 'main' is not exported:
[2 of 2] Compiling Main ( Main.hs, Main.o )
Main.hs:1:1:
The main function `main' is not exported by module `Main'
However, if I add main
to the export list or omit the empty export list, I see lots of multiple definition errors during the linking phase:
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
Assuming this error is the result of obsolete code or obsolete ghc interface presented by the text, what would be the proper way to compile this SimpleJSON example?
This should work:
ghc -o simple Main.hs SimpleJSON.hs
Or even something like this should work:
ghc -c SimpleJSON.hs
ghc -c Main.hs
ghc -o simple Main.o SimpleJSON.o
Or as @chi points out, you can use this:
ghc --make SimpleJSON.hs Main.hs
链接地址: http://www.djcxy.com/p/43410.html
上一篇: ghc未能编制完整性检查