首页 > 解决方案 > 调用 GHC API 时出现警告“hptSomeThingsBelowUs 中的警告,缺少模块……”的原因是什么以及如何摆脱它?

问题描述

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

Module.hs

module Module (
    value_in_module
) where

value_in_module = 1234 :: Int

test.hs

module Test (
    value
) where

import Module

value = value_in_module

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

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了,但是函数core2core发出了上面的警告消息。一对注释之间的六行似乎与程序的其余部分无关,因为这只是我从另一个更大的项目中提取的一个最小的可重现示例。警告信息在这里也没有什么坏处,但它会在该项目中引起更严重的问题。GHC API 似乎没有很好的文档记录,所以经过大量搜索后我无法解决问题。谁能解释警告消息的原因,并帮助我使用 GHC API 处理多个文件?提前致谢。

标签: haskellghcghcighc-api

解决方案


推荐阅读