使用阴谋时插件包装未知符号

Att*_*tic 11 plugins haskell ghc cabal cabal-install

我正在搞乱插件包但是我碰到了一个问题.

这是代码:

UTIL/Header.hs

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

data PT a = PT a deriving Show
Run Code Online (Sandbox Code Playgroud)

Plug.hs

module Plug(helloPlugin) where
import Util.Header
helloPlugin :: PT Int
helloPlugin = PT 1
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这一切都很好,然后用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.)
Run Code Online (Sandbox Code Playgroud)

我非常简约的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
Run Code Online (Sandbox Code Playgroud)

现在我假设问题是它无法找到"ErrUtils"模块,它是安装在/usr/lib/ghc-7.xx中的ghc软件包的一部分,因为它使用的是cabal,它将使用$ HOME/.cabal/lib /而不是.

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

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

所以有几个问题:

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

提前致谢!

Jos*_*tor 3

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

将加载调用更改为

load "Plug.o" [".","dist/build/plugintest/plugintest-tmp"] [] "testplugin"
Run Code Online (Sandbox Code Playgroud)

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

对此感到非常恼火...该错误表明它在链接标准库时存在问题,那么为什么向它显示这些.o 文件可以修复它呢?不管怎样,这对我有用,并且不需要大量处理 .cabal 文件。