GHC编译错误?
前一段时间,我设计了一个小系统,使我的Haskell程序的编译和测试更加舒适。 我的项目根目录如下所示:
./bin/
./bin/myMain
./bin/test
./interfaces/
./obj/
./src/
./src/makefile
./src/MyLib.hs
./src/myMain.hs
./src/testSuite.hs
myMain是主要模块,其进口如下:
import MyLib
-- irrelevant content follows
testSuite类似:
import System.Exit
import Test.HUnit
import MyLib
-- irrelevant content follows
我用两个简单的命令编译这些文件:
ghc testSuite.hs -o ../bin/test -odir ../obj -hidir ../interfaces
ghc myMain.hs -o ../bin/myMain -odir ../obj -hidir ../interfaces
现在,当我运行第一个测试套件时,即使存在任何对象或接口文件,整个测试套件也会编译并执行完美。 但是,当我运行第二个编译主要可执行文件时,它会再次编译测试二进制文件,除非我运行删除对象和接口文件。
原因是,据我Main.o
,主模块生成Main.o
和Main.hi
,不管名称是什么。 因此,在编译myMain时,GHC会看到这些文件存在,因此不会重新编译主模块。 奇怪的部分是,当我编译测试套件时情况并非如此 - 在这种情况下,即使存在对象和接口,也会重新编译Main。
$ ghc testSuite.hs -o ../bin/test -odir ../obj -hidir ../interfaces
[1 of 2] Compiling MyLib ( MyLib.hs, ../obj/MyLib.o )
[2 of 2] Compiling Main ( testSuite.hs, ../obj/Main.o )
Linking ../bin/test ...
$ ghc myMain.hs -o ../bin/myMain -odir ../obj -hidir ../interfaces
Linking ../bin/myMain ...
但是当我首先运行主编译:
$ ghc myMain.hs -o ../bin/myMain -odir ../obj -hidir ../interfaces
[1 of 2] Compiling MyLib ( MyLib.hs, ../obj/MyLib.o )
[2 of 2] Compiling Main ( myMain.hs, ../obj/Main.o )
Linking ../bin/myMain ...
$ ghc testSuite.hs -o ../bin/test -odir ../obj -hidir ../interfaces
[2 of 2] Compiling Main ( testSuite.hs, ../obj/Main.o ) [Test.HUnit changed]
Linking ../bin/test ...
更奇怪的是,当我放置-odir
和-hidir
GHC参数并将所有内容编译到同一目录时,问题就消失了。 为什么?
[注意:]
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
链接地址: http://www.djcxy.com/p/7519.html
上一篇: GHC compilation bug?