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