Haskell GHCI没有加载编译对象文件

时间:2012-11-28 01:25:57

标签: haskell ghc ghci

我希望GHCI加载一个模块的编译对象代码,该模块在编译时明显快于无编译版本。当所有文件都在同一目录(没有模块层次结构)时,这很有效。但是,当文件位于模块层次结构中时,它们不起作用。

工作版MyFile.hs:

import Basic
import Histogram

其中Basic.o和Histogram.o与MyFile.hs在同一目录中

不工作版本MyFile.hs:

import Util.Basic
import Util.Histogram

其中Basic.o和Histogram.o位于子目录Util中。使用此版本,我在加载MyFile.hs时会得到以下内容:

[1 of 2] Compiling Util.Basic ( Util/Basic.hs, interpreted )
[2 of 2] Compiling Util.Histogram ( Util/Histogram.hs, interpreted )
Ok, modules loaded: Util.Basic, Util.Histogram.

我希望能够在模块中组织我的代码,但仍然可以从使用编译的o文件中获益。

此外,应该注意的是,自编译o文件以来,源文件尚未更改。

编辑: 以下是每个文件的内容:

MyFile.hs

import Util.Basic
import Util.Histogram

的Util / Basic.hs

module Util.Basic () where

的Util / Histogram.hs

module Util.Histogram () where

文件/编辑:

$:~/programming/haskell/example-error$ ls
MyFile.hs  MyFile.hs~  Util
$:~/programming/haskell/example-error$ cd Util
$:~/programming/haskell/example-error/Util$ ls
Basic.hs  Basic.hs~  Histogram.hs  Histogram.hs~
$:~/programming/haskell/example-error/Util$ ghc *.hs
[1 of 2] Compiling Util.Histogram   ( Histogram.hs, Histogram.o )
[2 of 2] Compiling Util.Basic       ( Basic.hs, Basic.o )
$:~/programming/haskell/example-error/Util$ ls
Basic.hi  Basic.hs~  Histogram.hi  Histogram.hs~
Basic.hs  Basic.o    Histogram.hs  Histogram.o
$:~/programming/haskell/example-error/Util$  cd ../
$:~/programming/haskell/example-error$ ghci -ignore-dot-ghci MyFile.hs
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 3] Compiling Util.Histogram   ( Util/Histogram.hs, interpreted )
[2 of 3] Compiling Util.Basic       ( Util/Basic.hs, interpreted )
[3 of 3] Compiling Main             ( MyFile.hs, interpreted )
Ok, modules loaded: Util.Basic, Util.Histogram, Main.
*Main> 

解决方案按照Daniel的建议运作:

The fix is to compile the importing file, and the files in the 
subdirectory only as a consequence of that, not directly. 

1 个答案:

答案 0 :(得分:5)

问题与下面讨论的相同,标志发生了变化:

~/.../Util> ghc Other.hs
[1 of 1] Compiling Util.Other       ( Other.hs, Other.o )
~/.../Util> cd ..
~/.../src> ghc MyFile.hs
[1 of 2] Compiling Util.Other       ( Util/Other.hs, Util/Other.o ) [flags changed]
[2 of 2] Compiling MyFile           ( MyFile.hs, MyFile.o )

我没有找到特别的标志,或者为什么在单独编译期间传递的标志与从编译作为从导入模块追逐的模块时传递的标志不同,但是它们确实发生了变化,因此重新编译是必要的(具体来说,.hi文件中的标志哈希值会发生变化)。

因此,修复程序不是单独编译模块,而是将它们编译为顶级导入程序的依赖项。


原来几乎正确的猜测:

我只能部分重现这一点。编译完成后touch MyFile.hs

$ ghci-7.4.2 MyFile.hs
-- snip
[1 of 2] Compiling Util.Other       ( Util/Other.hs, interpreted )
[2 of 2] Compiling MyFile           ( MyFile.hs, interpreted )
Ok, modules loaded: MyFile, Util.Other.

它看起来和你一样,但是对于7.6.1,我们得到一个提示(编译和touch):

$ ghci MyFile.hs
-- snip
[1 of 2] Compiling Util.Other       ( Util/Other.hs, interpreted ) [flags changed]
[2 of 2] Compiling MyFile           ( MyFile.hs, interpreted )
Ok, modules loaded: MyFile, Util.Other.

标志改变了。我的:set -XNoMonomorphismRestriction文件中有.ghci,标志的更改会导致重新编译。

$ ghci -ignore-dot-ghci MyFile.hs
GHCi, version 7.6.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[2 of 2] Compiling MyFile           ( MyFile.hs, interpreted )
Ok, modules loaded: MyFile, Util.Other.

使用未为编译指定的标志忽略有问题的.ghci,未解释未更改的Util.Other,使用已编译的代码。 (GHC <7.4时,甚至不需要忽略.ghci文件。)

如果您有一个.ghci文件,您可以在其中设置语言选项(NoMonomorphismRestrictionTypeFamilies,...)和ghc&gt; = 7.4,则需要忽略.ghci 1}}加载模块时的文件。

如果不是这种情况,则重新编译不是预期的行为。然后,需要更多信息来诊断问题并找到解决方法。

半合作将成为ghci的-fobject-code标志。