构建Haskell程序时__stginit_的多重定义

时间:2018-05-10 05:54:32

标签: haskell

您好我正在尝试从两个文件构建一个haskell程序;一个是一个模块,其中一些函数用于表示json,另一个是一个简单的main函数。以下书中的示例(RWH)ghc在链接时崩溃。

Jlib.hs
Main.hs

主要

module Main where
    import Jlib 
    import System.Environment

    main::IO()
    main=print(JObject[("p0",JNumber 3),("p1",JString "asta")])

我使用命令:

ghc -c Jlib.hs
ghc -o Main Main.hs Jlib.o

我收到以下错误:

$ ghc -o Main Main.hs Jlib.o
[2 of 2] Compiling Main             ( Main.hs, Main.o )
Linking Main.exe ...
Jlib.o:fake:(.data+0x0): multiple definition of `__stginit_Jlib'
.\Jlib.o:fake:(.data+0x0): first defined here
Jlib.o:fake:(.data+0x60): multiple definition of `Jlib_zdfShowJValue_closure'

我的文件夹如下所示:

Jlib.hs
Jlib.o
Jlib.hi
Main.hs
Main.o
Main.hi

我在问,因为这是本书的一个例子。

稍后修改:添加了Jlib模块

module Jlib(
    JValue(..),
    getString,
    getInt,
    getBool,
    getObject,
    getArray
) 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::JValue->Maybe Int
    getInt (JNumber n)=Just (truncate n)
    getInt _= Nothing

    getBool::JValue->Maybe Bool
    getBool (JBool b)=Just b
    getBool _=Nothing

    getObject (JObject obj)=Just obj
    getObject _=Nothing

    getArray (JArray a)=Just a
    getArray _=Nothing

1 个答案:

答案 0 :(得分:3)

当提到任何Haskell源时,现代GHC现在隐式使用--make模式。

来自docs

  

--make

     

在这种模式下,GHC将自动构建一个多模块Haskell程序,为自己找出依赖关系。如果你有   直截了当的Haskell程序,这可能会更容易,而且   比使用 make 更快。制作模式在Using ghc –make

中描述      

如果命令行中提到了任何Haskell源文件,则此模式是默认模式,在这种情况下,--make选项可以   被省略。

在您的情况下,GHC会自动添加Jlib进行编译和链接,因为您在命令行中指定了Main.hs。由于您还指定了Jlib.o,因此会导致Jlib.o链接两次,从而导致许多重复的定义。

您只需使用

即可
ghc -o Main Main.hs

让GHC自动处理依赖关系,根据需要进行编译和链接。

如果您想要单独编译和链接,请改用

ghc -c Jlib.hs
ghc -c Main.hs
ghc -o Main Main.o Jlib.o