首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GHC: ghc给出了clang错误,但是ghc

GHC: ghc给出了clang错误,但是ghc
EN

Stack Overflow用户
提问于 2021-08-01 07:44:20
回答 1查看 118关注 0票数 0

长话短说:我有两个.hs文件,其中Main.hs使用模块Lib.hs

当我试图按照“真实世界Haskell”(第115页)一书的建议编译它们时,我遇到了一些问题:

代码语言:javascript
复制
$ 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时,它工作得很好。

代码语言:javascript
复制
 $ 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版本是

代码语言:javascript
复制
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.10.5
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-01 07:56:52

来自GHC博士

-制造 在这种模式下,GHC将自动构建一个多模块Haskell程序,为自己找出依赖项。如果您有一个简单的Haskell程序,这可能比使用make容易得多,而且速度快得多。。。 如果命令行中提到任何Haskell源文件,则默认模式是此模式,在本例中,可以省略--make选项。

因此你的路线

代码语言:javascript
复制
ghc -o main Main.hs Lib.o 

实际上意味着

代码语言:javascript
复制
ghc -o main --make Main.hs Lib.o 

它将编译和链接Main.hs及其所有依赖项(包括Lib.o),在链接期间添加另一个Lib.o。这将链接Lib.o两次,触发OP报告的链接器错误。

我想这是在真实世界Haskell写完后在GHC中改变的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68608409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档