1
根據another question,現實世界哈斯克爾的部分現在已經過時。我只是在第5章,但是我在編譯一個可執行二進制文件的簡單示例時遇到問題。真實世界哈斯克爾,第5章,SimpleJSON編譯錯誤
兩個模塊中給出:
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
和
module Main() where
import SimpleJSON
main = print (JObject [ ("foo", JNumber 1), ("bar", JBool False) ])
與指令以編譯SimpleJSON對象文件第一:
$ ghc -c SimpleJSON.hs
隨後通過鏈接可執行:
$ ghc -o simple Main.hs SimpleJSON.o
導致錯誤,指出「主」不外傳:
[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例子的正確方法?
' --make'應該可以工作。 – chi 2015-02-11 21:10:20
謝謝Sibi。這兩個例子似乎都有效。儘管第二個問題有一個小問題,那就是編譯Main依賴於SimpleJSON的接口文件。簡單地交換訂單對我來說是個訣竅。感謝志。 '--make'看起來是ghc提供的一個非常強大的工具! – bpaterni 2015-02-11 23:03:40