调用GHC API时出现警告“在hptSomeThingsBelowUs中出现警告,缺少模块...”的原因是什么以及如何摆脱它?

问题描述

我尝试使用 GHC API 动态加载多个 .hs 文件。我写了两个 .hs 文件test.hsModule.hs,并将它们放入 /tmp 文件夹中。这两个文件非常简单。 Module.hs 定义了一个名为 Module 的模块,其中包含一个 Int 值,而 test.hs 定义了模块 Test,它导入 Module 并复制 {{1 }} 对自身的价值。它们的内容如下所示。

Int :

Module.hs

module Module ( value_in_module ) where value_in_module = 1234 :: Int :

test.hs

然后在另一个文件中,我编写了以下代码调用 GHC API 并加载这两个文件

module Test (
    value
) where

import Module

value = value_in_module

程序运行,但输出如下。

import Control.applicative
import DynFlags
import GHC
import GHC.Paths
import MonadUtils (liftIO)
import Unsafe.Coerce
import SimplCore (core2core)
    
main = defaultErrorHandler defaultFatalMessager defaultFlushOut $
    runGhc (Just libdir) $ do
        env <- getSession
        dflags <- getSessionDynFlags
        setSessionDynFlags $ dflags { hscTarget = HscInterpreted,ghcLink = LinkInMemory }

        setTargets =<< sequence [guesstarget "/tmp/Module.hs" nothing,guesstarget "/tmp/test.hs" nothing]
        load LoadAllTargets
        setContext [ IIModule $ mkModuleName "Test" ]

        -- The following six lines are just for reproducing the warning.
        modSum <- getModSummary $ mkModuleName "Test"
        pmod <- parseModule modSum
        tmod <- typecheckModule pmod
        dmod <- desugarModule tmod
        let core = coreModule dmod
        core' <- liftIO $ core2core env core -- Warning happens here.
        -- end
        
        act <- unsafeCoerce <$> compileExpr "print value"           
        liftIO act

我们可以注意到,程序成功地计算了表达式 WARNING in hptSomeThingsBelowUs missing module Module Probable cause: out-of-date interface files 1234 ,并输出print value,但是函数 1234 发出了上面的警告消息。一对注释之间的六行似乎与程序的其余部分无关,因为这只是我从另一个更大的项目中提取的最小可重复示例。此外,警告消息在这里并没有什么坏处,但它会在该项目中引起更严重的问题。 GHC API 似乎没有很好的文档记录,所以经过大量搜索后我无法解决问题。谁能解释警告消息的原因,并帮助我使用 GHC API 处理多个文件?提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)