长话短说:我有两个.hs文件,其中Main.hs使用模块Lib.hs
当我试图按照“真实世界Haskell”(第115页)一书的建议编译它们时,我遇到了一些问题:
$ ghc -c Lib.hs
$ ghc -o main Main.hs Lib.o
[2 of 2] Compiling Main ( Main.hs, Main.o )
Linking main ...
duplicate symbol '_Lib_add1_info' in:
./Lib.o
Lib.o
duplicate symbol '_Lib_add1_closure' in:
./Lib.o
Lib.o
ld: 3 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
`clang' failed in phase `Linker'. (Exit code: 1)但是,当我简单地使用ghc --make时,它工作得很好。
$ ghc --make Main.hs
[1 of 2] Compiling Lib ( Lib.hs, Lib.o )
[2 of 2] Compiling Main ( Main.hs, Main.o )
Linking Main ...
$ ls -1
Lib.hi
Lib.hs
Lib.o
Main
Main.hi
Main.hs
Main.o有人能解释为什么ghc --make可以工作,而简单地说,ghc不工作吗?
顺便说一下,我的ghc版本是
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.10.5发布于 2021-08-01 07:56:52
来自GHC博士
-制造 在这种模式下,GHC将自动构建一个多模块Haskell程序,为自己找出依赖项。如果您有一个简单的Haskell程序,这可能比使用make容易得多,而且速度快得多。。。 如果命令行中提到任何Haskell源文件,则默认模式是此模式,在本例中,可以省略
--make选项。
因此你的路线
ghc -o main Main.hs Lib.o 实际上意味着
ghc -o main --make Main.hs Lib.o 它将编译和链接Main.hs及其所有依赖项(包括Lib.o),在链接期间添加另一个Lib.o。这将链接Lib.o两次,触发OP报告的链接器错误。
我想这是在真实世界Haskell写完后在GHC中改变的。
https://stackoverflow.com/questions/68608409
复制相似问题