编译 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