编译 Haskell 程序时出现链接器错误
Linker error while compiling Haskell program
我正在使用 happstack 在 Haskell 中编写 Web 服务器。网络服务器将算术方程式作为输入,对其进行计算并 returns 结果。在服务器端,我需要缓存任何先前查询的结果。我正在使用 redis 键值数据存储。以下是我写到现在的内容。
module Main where
import Control.Monad (msum)
import Control.Monad.Trans.Class
import Language.Haskell.Interpreter
import Happstack.Server (nullConf, simpleHTTP, toResponse, ok, path, dir)
import Happstack.Server.Internal.Monads
import Text.JSON.Generic
import qualified Database.Redis as R
import qualified Data.ByteString.Char8 as C
main :: IO ()
main = simpleHTTP nullConf $
msum [dir "eval" $ path $ \s -> handleRequest s]
data Response = Response
{ success :: Bool
, cacheHit :: Bool
, result :: String
, error :: String
} deriving (Show, Data, Typeable)
myConnectionInfo :: R.ConnectInfo
myConnectionInfo = R.defaultConnectInfo
handleRequest :: String -> ServerPartT IO String
handleRequest exp = lift $ evalExp exp
evalExp :: String -> IO String
evalExp exp = do
cachedResult <- checkCache exp
-- CODE FOR CHECKING CACHED RESULT IS NOT YET COMPLETE
x <- runInterpreter $ setImports ["Prelude"] >> eval exp
let (error, isSuccess, result) = case x of Left _ -> ("Parse error", False, "")
Right b -> ("", True, b)
let y = Response isSuccess False result error
return $ encodeJSON y
checkCache :: String -> IO (Either R.Reply (Maybe C.ByteString))
checkCache exp = do
conn <- R.connect myConnectionInfo
R.runRedis conn $ R.get $ C.pack exp
编译上述程序时出现以下错误:
$ ghc calcServer.hs -XDeriveDataTypeable
Linking calcServer ...
/home/siddhant/.cabal/lib/text-1.2.2.0/ghc-7.6.3/libHStext-1.2.2.0.a(cbits.o): In function `_hs_text_memcpy':
cbits.c:(.text+0x0): multiple definition of `_hs_text_memcpy'
/usr/lib/haskell-packages/ghc/lib/text-0.11.3.1/ghc-7.6.3/libHStext-0.11.3.1.a(cbits.o):(.text+0x0): first defined here
/home/siddhant/.cabal/lib/text-1.2.2.0/ghc-7.6.3/libHStext-1.2.2.0.a(cbits.o): In function `_hs_text_memcmp':
cbits.c:(.text+0x20): multiple definition of `_hs_text_memcmp'
/usr/lib/haskell-packages/ghc/lib/text-0.11.3.1/ghc-7.6.3/libHStext-0.11.3.1.a(cbits.o):(.text+0x20): first defined here
/home/siddhant/.cabal/lib/text-1.2.2.0/ghc-7.6.3/libHStext-1.2.2.0.a(cbits.o): In function `_hs_text_decode_latin1':
cbits.c:(.text+0x40): multiple definition of `_hs_text_decode_latin1'
/usr/lib/haskell-packages/ghc/lib/text-0.11.3.1/ghc-7.6.3/libHStext-0.11.3.1.a(cbits.o):(.text+0x40): first defined here
/home/siddhant/.cabal/lib/text-1.2.2.0/ghc-7.6.3/libHStext-1.2.2.0.a(cbits.o): In function `_hs_text_decode_utf8':
cbits.c:(.text+0x2a0): multiple definition of `_hs_text_decode_utf8'
/usr/lib/haskell-packages/ghc/lib/text-0.11.3.1/ghc-7.6.3/libHStext-0.11.3.1.a(cbits.o):(.text+0xf0): first defined here
collect2: error: ld returned 1 exit status
我猜可能是因为链接了相同二进制文件的不同版本。我对吗?
请帮助我如何更正此错误
您似乎安装了两个 text
软件包。尝试 ghc-pkg list text
来确认。如果是这样,您可以隐藏其中之一,例如ghc -hide-package=text-1.2.0.3
。注意:它可能会导致其他一些包也被隐藏,在这种情况下,您可以对代码进行 cabalize 或使用 stack
以确保仅链接 text
的一个版本。
像hs_text_memcpy
这样的函数来自这里:https://github.com/bos/text/blob/master/cbits/cbits.c#L14
我正在使用 happstack 在 Haskell 中编写 Web 服务器。网络服务器将算术方程式作为输入,对其进行计算并 returns 结果。在服务器端,我需要缓存任何先前查询的结果。我正在使用 redis 键值数据存储。以下是我写到现在的内容。
module Main where
import Control.Monad (msum)
import Control.Monad.Trans.Class
import Language.Haskell.Interpreter
import Happstack.Server (nullConf, simpleHTTP, toResponse, ok, path, dir)
import Happstack.Server.Internal.Monads
import Text.JSON.Generic
import qualified Database.Redis as R
import qualified Data.ByteString.Char8 as C
main :: IO ()
main = simpleHTTP nullConf $
msum [dir "eval" $ path $ \s -> handleRequest s]
data Response = Response
{ success :: Bool
, cacheHit :: Bool
, result :: String
, error :: String
} deriving (Show, Data, Typeable)
myConnectionInfo :: R.ConnectInfo
myConnectionInfo = R.defaultConnectInfo
handleRequest :: String -> ServerPartT IO String
handleRequest exp = lift $ evalExp exp
evalExp :: String -> IO String
evalExp exp = do
cachedResult <- checkCache exp
-- CODE FOR CHECKING CACHED RESULT IS NOT YET COMPLETE
x <- runInterpreter $ setImports ["Prelude"] >> eval exp
let (error, isSuccess, result) = case x of Left _ -> ("Parse error", False, "")
Right b -> ("", True, b)
let y = Response isSuccess False result error
return $ encodeJSON y
checkCache :: String -> IO (Either R.Reply (Maybe C.ByteString))
checkCache exp = do
conn <- R.connect myConnectionInfo
R.runRedis conn $ R.get $ C.pack exp
编译上述程序时出现以下错误:
$ ghc calcServer.hs -XDeriveDataTypeable
Linking calcServer ...
/home/siddhant/.cabal/lib/text-1.2.2.0/ghc-7.6.3/libHStext-1.2.2.0.a(cbits.o): In function `_hs_text_memcpy':
cbits.c:(.text+0x0): multiple definition of `_hs_text_memcpy'
/usr/lib/haskell-packages/ghc/lib/text-0.11.3.1/ghc-7.6.3/libHStext-0.11.3.1.a(cbits.o):(.text+0x0): first defined here
/home/siddhant/.cabal/lib/text-1.2.2.0/ghc-7.6.3/libHStext-1.2.2.0.a(cbits.o): In function `_hs_text_memcmp':
cbits.c:(.text+0x20): multiple definition of `_hs_text_memcmp'
/usr/lib/haskell-packages/ghc/lib/text-0.11.3.1/ghc-7.6.3/libHStext-0.11.3.1.a(cbits.o):(.text+0x20): first defined here
/home/siddhant/.cabal/lib/text-1.2.2.0/ghc-7.6.3/libHStext-1.2.2.0.a(cbits.o): In function `_hs_text_decode_latin1':
cbits.c:(.text+0x40): multiple definition of `_hs_text_decode_latin1'
/usr/lib/haskell-packages/ghc/lib/text-0.11.3.1/ghc-7.6.3/libHStext-0.11.3.1.a(cbits.o):(.text+0x40): first defined here
/home/siddhant/.cabal/lib/text-1.2.2.0/ghc-7.6.3/libHStext-1.2.2.0.a(cbits.o): In function `_hs_text_decode_utf8':
cbits.c:(.text+0x2a0): multiple definition of `_hs_text_decode_utf8'
/usr/lib/haskell-packages/ghc/lib/text-0.11.3.1/ghc-7.6.3/libHStext-0.11.3.1.a(cbits.o):(.text+0xf0): first defined here
collect2: error: ld returned 1 exit status
我猜可能是因为链接了相同二进制文件的不同版本。我对吗? 请帮助我如何更正此错误
您似乎安装了两个 text
软件包。尝试 ghc-pkg list text
来确认。如果是这样,您可以隐藏其中之一,例如ghc -hide-package=text-1.2.0.3
。注意:它可能会导致其他一些包也被隐藏,在这种情况下,您可以对代码进行 cabalize 或使用 stack
以确保仅链接 text
的一个版本。
像hs_text_memcpy
这样的函数来自这里:https://github.com/bos/text/blob/master/cbits/cbits.c#L14