【问题标题】:Undefined reference to .. error (Linux) - Compiles fine in OSX对 .. 错误的未定义引用 (Linux) - 在 OSX 中编译良好
【发布时间】:2013-08-07 04:02:42
【问题描述】:

已经浪费了几乎整整 4 天的时间来编译这个包。它在 OSX 10.6 中编译得很好,但是当我尝试在 linux(Kubuntu 10.04、3.8.0.27 内核)机器上编译它时给出未定义的引用错误。

错误似乎是 makefile 的顺序错误,但是 AFAIK,我是唯一一个在编译它时遇到问题的人。因此,我试图找出造成差异的原因。软件包相当大,编辑 Makefile 并在这里和那里移动 30-50 个库似乎不是一个好主意。

这是我认为到目前为止我发现的不同之处

  • 编译器 - gcc-4.7 (Linux) 和 llvm-gcc-4.2 (OSX)
  • 编译器标志 --shared (Linux) 和 -dynamic -dynamiclib -undefined dynamic_lookup (OSX)

大家有什么建议吗?

  1. 我尝试使用clang++llvm-gcc-4.7 作为编译器,但我认为它仍然使用相同的链接器(ld?)。所以我可以尝试指定使用llvm?我该怎么做?

  2. --shared 标志与 OSX 中的 dynamic -dynamiclib -undefined dynamic_lookup 标志有什么不同吗?

  3. Linux 内核或发行版重要吗? (我认为他们在 CentOS 机器上编译得很好)

请帮忙。 非常感谢。

【问题讨论】:

    标签: c++ linker clang llvm llvm-gcc


    【解决方案1】:

    使用 gcc 4.4 编译它并完美运行。我猜对于给定的包,顺序在 4.4 上并不重要。

    【讨论】:

      【解决方案2】:

      未定义的引用类型的错误可能是由于符号未编译、未链接或链接无序引起的。调试的方法是检查链接器行,即链接器抱怨的符号。错误消息可能会告诉您哪个目标文件具有依赖关系。

      现在,您需要确定该符号是否已编译或链接,因为您需要确定它是否在任何目标文件或任何库中以及哪个。您可以使用nm 命令行工具列出在任何给定 .o 或库中定义的符号。如果符号不存在,那么您需要弄清楚要添加到链接器行的内容,这将解决它。

      如果符号出现在一个库中,则确定哪些库依赖于该符号(来自链接器错误消息)以及包含它的库。在链接器命令行中,前者必须列在后者之前(假设为静态链接)。

      作为一个简单的hack,虽然我不建议这样做,但您可以使用--start-group--end-group command line options 来指示gcc 链接器执行多次传递。虽然我真的建议您弄清楚依赖关系的顺序,因为这也可以让您更好地了解您的项目。

      【讨论】:

      • 是的,我这样做了,移动了一些东西,然后编译了所有东西,但是现在我在运行它们时遇到了错误。我没有仔细研究它。问题是,它如何在 OSX 机器上编译?即使文件引用了该库之后列出的给定库,它也能正常编译...这就是为什么我认为它与编译器有关。
      猜你喜欢
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      相关资源
      最近更新 更多