【问题标题】:gcc: Allow Undefined Symbols [closed]gcc:允许未定义的符号[关闭]
【发布时间】:2012-02-08 19:21:43
【问题描述】:

我不希望 gcc 链接器将未定义的符号显示为链接错误。我在 MAC OSX 10.6 上使用 gcc 4.2

当然我已经在网上寻找解决方案,但所有尝试都失败了!

如何修改此命令以消除未定义符号错误?

gcc -o Proj $(wildcard *.o);

谢谢。

编辑:我正在做一个研究项目,我需要代码是可链接的,我不在乎它是否会有运行时异常

【问题讨论】:

  • 命令与问题有什么关系?另外,如果链接阶段失败,您如何期望从中获得可执行的二进制文件? ...这是一个错误而不是警告的原因;)
  • 这是我一直以来最喜欢的问题之一。
  • 有一些选项可以抑制链接错误,例如 sourceware.org/binutils/docs/ld/Options.html 我正在研究一个需要可链接代码的项目不在乎它是否会有运行时异常
  • 与运行时错误无关。如果有不存在的功能,它就无法运行。例如,如果 main 是链接器错误怎么办?是什么让您认为可以忽略这些链接器错误?
  • @Pansy:调查什么?您是否考虑过您可能在这里问了错误的问题?你想用这个来达到什么目的?

标签: c gcc linker


【解决方案1】:

嗯?这是没有意义的。 一个错误,不能忽略。当链接器无法完成其工作时,您无法构建可执行文件。你会期望它只是简单地发明一个实现并希望它能够成功吗?

相反,您需要学习如何正确配置要构建的项目。如果您依赖于外部库,则需要在链接器搜索路径中添加其路径。

编辑:根据您的评论...

有一些选项可以抑制链接错误,例如 sourceware.org/binutils/docs/ld/Options.html 我正在做一个研究项目,我需要代码是可链接的,我不在乎它会有运行时异常

嗯,你仍然不能,它仍然没有意义。请仔细阅读该部分:

在链接时指定的共享库中允许未定义的符号引用的原因是:

在链接时指定的共享库可能与在加载时可用的共享库不同,因此该符号实际上可能在加载时可解析。 有一些操作系统,例如BeOS和HPPA,共享库中未定义的符号是正常的。

因此,在某些情况下,在共享库中允许未定义的符号是合理的,因为您可能没有链接到您将在实践中链接到的同一版本的动态库。

但是,您想要构建一个可执行文件,而不是共享库,因此按照您的要求没有任何意义。你只是有一个可执行文件,它是 borked 并且不能工作。为什么任何理智的编译器都会允许这样的条件?

【讨论】:

  • 有一些选项可以抑制链接错误,例如这里sourceware.org/binutils/docs/ld/Options.html 我正在做一个研究项目,我需要代码是可链接的,我不在乎它是否有运行时例外
  • @Pansy:我编辑了我的回复,但这不是你想要的。
  • 链接文档适用于 GNU ld,不适用于 OS X,但 GNU ld 实际上允许您使用 --unresolved-symbols=ignore-all 生成带有未解析符号的可执行文件。这样做是“有道理的”,因为它的定义很明确,但这并不是一件明智的事情。为什么一个理智的编译器会允许这样做?判断不是编译器的工作。
【解决方案2】:

您可以改用ld -r -o Proj.o $(wildcard *.o)
您将获得的不是可以运行的可执行文件,而是可以链接到可执行文件的目标文件。在最后的链接中,您必须提供未解析的符号。

【讨论】:

    【解决方案3】:

    您可能想要创建一个库而不是 exe。这些不应产生链接器错误。

    ar r libProj.a $(wildcard *.o)
    ranlib libProj.a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 2016-08-31
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多