【问题标题】:Multiple definition of __stginit_ when building Haskell program构建Haskell程序时__stginit_的多重定义
【发布时间】:2018-05-10 23:42:04
【问题描述】:

您好,我正在尝试从两个文件构建一个 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

【问题讨论】:

  • 我们能看看 Jlib 长什么样吗?
  • 当然我不想污染初始代码sn-p。我在初始帖子中添加了定义。

标签: haskell


【解决方案1】:

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

来自docs

--make

在这种模式下,GHC 会自动构建一个多模块的 Haskell 程序,为自己找出依赖关系。如果你有一个 简单的 Haskell 程序,这可能会容易得多,并且 比使用 ma​​ke 更快。 Using ghc –make 中描述了 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多