未定义的引用..错误(Linux) - 在OSX中编译良好

时间:2013-08-07 04:02:42

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

尝试编译此软件包几乎浪费了整整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)
  • 编译器标志 - 共享(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机器上编译得很好)

  4. 请帮忙。 非常感谢。

2 个答案:

答案 0 :(得分:1)

用gcc 4.4编译并完美无缺地工作。我猜这个订单包的顺序与4.4无关。

答案 1 :(得分:0)

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

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

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

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