11

プラグイン パッケージをいじっていますが、問題が発生しました。

コードは次のとおりです。

Util/Header.hs

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

data PT a = PT a deriving Show

Plug.hs

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

Main.hs

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.)

私の非常に最小限のcabalファイル:

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

ここで問題は、/usr/lib/ghc-7.xx にインストールされた ghc パッケージの一部である "ErrUtils" モジュールが見つからないことだと思います。cabal を使用しているため、$HOME/.cabal を使用します。 /lib/ 代わりに。

/usr/lib を配布可能にしたいのであれば、明らかに使いたくないでしょう。悲しいことに、私はパッケージがどのように管理されているか、またプラグイン パッケージにも精通していません。

これは非常に面倒だと感じていますが、自分で解決策を見つけることができませんでした。

いくつか質問があります:

  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

Cabal がそれらをまとめてパッケージ化するには、モジュールexported-とモジュールを宣言する必要があります。other-たとえば(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

これらのモジュールの 1 つを除外すると、Cabal がパッケージ化されていないシンボルを検出できることを期待するファイルをコンパイルするため、ビルド エラーが発生する可能性があります。

あなたの場合、実行可能ファイルをビルドしているため、上記の一般的なパターンは、すべてのコードをライブラリに入れ、実行可能側をそのライブラリに依存させることです。たとえば、この例では、の完全なテキストは次のとおりexe/Server.hsです。

module Main where

import qualified HKTest as HK

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