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



您好,我正在尝试从两个文件构建一个 Haskell程序;一个是带有一些表示 JSON 的函数的模块,另一个是一个简单的主函数。按照书中的示例(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

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

从文档中:

--make

在这种模式下,GHC将自动构建一个多模块Haskell程序,为自己找出依赖关系。如果您有 简单的Haskell程序,这可能要容易得多,并且 比使用make更快。Make 模式在使用 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

最新更新