【问题标题】:Compiler error vs linker error? [closed]编译器错误与链接器错误? [关闭]
【发布时间】:2013-02-18 23:14:54
【问题描述】:

刚刚阅读 Effective C++,他多次提到“链接器错误”,而不是编译器错误。

什么构成“链接器错误”,它们与“编译器错误”有何不同?规则/解释是否基于一组类别以在逻辑上记住这一点?

【问题讨论】:

  • 我相信关于链接器(错误)和编译器(错误)之间区别的信息是广泛可用的。谷歌一下就行了。
  • 链接器错误从广义上讲是关于使用您在代码中声明但未定义(或定义太多次)的内容。链接过程建立了这些联系,这就是事情可能出错的地方。
  • 您实际上是在询问“编译”和“链接”之间的区别。设法了解这些。
  • 这里有一个比喻:想象你想画一条线(就像实数线一样)。现在有人可以给你几条线,你说,“看起来不错”。如果有人给你一个看起来像十字架的东西,你会立即知道它永远不会成为一行的一部分(“编译器错误”)。但是当你把所有的部分放在一起之后,你可能会发现你已经做了一个大圆圈!您从未从小部分中看到这一点,但您仍然没有得到您想要的:“链接器错误”。

标签: c++ c compiler-construction linker


【解决方案1】:

编译器错误表示编译器无法将您提供的源代码转换为目标代码。这通常意味着您自己的程序中存在语法或语义错误,您必须先解决该错误,然后您的程序才会表现出您希望它具有的行为。

链接器错误意味着链接器无法从您提供的目标代码构建可执行程序。这通常意味着您的程序没有正确地与它自己的依赖项或与外部世界(例如外部库)进行交互。

【讨论】:

    【解决方案2】:

    编译器错误是与编译期间代码语义相关的一类错误,即在将源文件转换为目标文件的过程中。在这里,您可能已经定义了某些假定可用的符号(例如 pthread_create)。

    链接器错误是在创建最终目标文件期间验证这些依赖关系时遇到的错误。继续上面的例子,为了创建可执行文件,你需要定义pthread_create,如果没有找到会给出一个链接器错误。

    【讨论】:

      【解决方案3】:

      gcc -c 编译不链接:

         -c  Compile or assemble the source files, but do not link.  The linking
             stage simply is not done.
      

      你可以编译一个文件,然后用-o链接它:

      $ gcc -c hello.s
      $ gcc -o test hello.o 
      $ ./test 
      Hi World
      

      【讨论】:

        猜你喜欢
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多