11

我正在搞乱插件包,但是我遇到了一个问题。

这是代码:

实用程序/Header.hs

module Util.Header(PT(..)) where

data PT a = PT a deriving Show

插件.hs

module Plug(helloPlugin) where
import Util.Header
helloPlugin :: PT Int
helloPlugin = PT 1

主文件

module Main where

import Util.Header
import System.Plugins

main :: IO ()
main = do
    mv <- load "Plug.o" ["."] [] "helloPlugin"
    case mv of
        LoadFailure msg -> print msg
        LoadSuccess _ v -> print $ show (v :: PT Int)

这一切都很好,然后用 ghc 编译。使用 Cabal 构建也可以正常工作,但是当我运行可执行文件时出现此错误:

plugintest: /home/kevin/.cabal/lib/plugins-1.5.4.0/ghc-7.6.3/HSplugins-1.5.4.0.o: unknown symbol `ghczm7zi6zi3_ErrUtils_zdsinsertzuzdsgo5_info'
plugintest: user error (resolvedObjs failed.)

我非常简约的阴谋集团文件:

name:                plugintest
version:             0.1.0.0
license-file:        LICENSE
build-type:          Simple
cabal-version:       >=1.8

library
  hs-source-dirs: src
  exposed-modules: Util.Header
  build-depends:  base ==4.6.*, plugins ==1.5.*

executable plugintest
  main-is: Main.hs
  build-depends:  base ==4.6.*, plugins ==1.5.*, plugintest == 0.1.0.0
  hs-source-dirs: src

现在我假设问题是它找不到“ErrUtils”模块,该模块是安装在 /usr/lib/ghc-7.xx 中的 ghc 包的一部分,因为它使用的是 cabal,它将使用 $HOME/.cabal /lib/ 代替。

现在,如果我想让它可分发,我显然不想使用 /usr/lib。可悲的是,我不太熟悉包的管理方式,也不熟悉插件包。

我有一种感觉,这是非常nooby,但我自己无法找到解决方案。

所以有几个问题:

  1. 如何让我的依赖项以某种方式工作以使其可分发?
  2. 看来我需要事先知道我的 Plugin.o 文件将依赖什么才能真正使用它们(如果我理解正确的话)。有没有办法打包一个我不必担心这个问题的 .o 文件?(对不起,如果这个问题太模糊,请随意忽略)

提前致谢!

4

2 回答 2

4

好的,所以我遇到了完全相同的问题。这是我找到的解决方法

将加载调用更改为

load "Plug.o" [".","dist/build/plugintest/plugintest-tmp"] [] "testplugin"

确保使用 -c 或使用插件中的“make”库编译东西。

对此感到非常恼火......该错误表明它在链接标准库时遇到问题,那么为什么显示这些.o 文件可以解决它?无论如何,这对我有用,并且不需要大量处理 .cabal 文件。

于 2014-02-23T17:23:28.810 回答
3

您必须声明您的exported-other-模块,以便 Cabal 将它们打包在一起。例如(来自https://github.com/tel/happstack-heroku-test

name:                hktest         -- note the name here names
                                    -- the *library* which is a package name
                                    -- in scope when building the executable

...

library
  exposed-modules:     
    HKTest
  other-modules:
    -- there aren't any, but there could be some
  build-depends:       base                >= 4.6    && <4.7

                       ...

                     , mtl                 >= 2.1.2
  hs-source-dirs:      src

executable server
  main-is:             Server.hs
  other-modules:
    -- there might be some use to having these here,
    -- but they'll be harder to get into GHCi, so I wouldn't
    -- recommend it---just put them in the library part
  build-depends:       base >=4.6 && <4.7
                     , hktest                  -- note that I grab all the hktest
                                               -- modules here  
  hs-source-dirs:      exe

如果我遗漏了其中一个模块,我可能会收到构建错误,因为 Cabal 编译的文件希望能够找到尚未打包的符号。

在您的情况下,由于您正在构建可执行文件,因此上面举例说明的常见模式是将所有代码放入库中,然后让可执行部分依赖于该库。例如,在这个例子中,完整的文本exe/Server.hs

module Main where

import qualified HKTest as HK

main :: IO ()
main = HK.main
于 2013-12-06T15:13:18.433 回答