2015-02-11 51 views
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例子的正確方法?

回答

4

這應該工作:

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 
+2

' --make'應該可以工作。 – chi 2015-02-11 21:10:20

+0

謝謝Sibi。這兩個例子似乎都有效。儘管第二個問題有一個小問題,那就是編譯Main依賴於SimpleJSON的接口文件。簡單地交換訂單對我來說是個訣竅。感謝志。 '--make'看起來是ghc提供的一個非常強大的工具! – bpaterni 2015-02-11 23:03:40