0

已经浪费了几乎整整 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++andllvm-gcc-4.7作为编译器,但我认为它仍然使用相同的链接器(ld?)。所以我可以尝试指定使用llvm?我怎么做?

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

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

请帮忙。非常感谢。

4

2 回答 2

1

用 gcc 4.4 编译它并完美地工作。我想对于给定的包,顺序在 4.4 上并不重要。

于 2013-09-11T22:39:37.700 回答
0

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

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

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

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

于 2013-08-07T04:36:07.877 回答