尝试编译此软件包几乎浪费了整整4天。它在OSX 10.6中编译得很好,但是当我尝试在linux(Kubuntu 10.04,3.8.0.27内核)机器上编译它时会出现未定义的引用错误。
错误似乎是makefile被错误排序,但AFAIK,我是唯一一个无法编译它的人。所以我试图找到有所作为的东西。软件包非常大,编辑Makefile并在这里移动30-50个库,这似乎不是一个好主意。
这是我认为到目前为止发现的差异
有人有任何建议吗?
我尝试使用clang++
和llvm-gcc-4.7
作为编译器,但我认为它仍使用相同的链接器(ld
?)。所以我可以尝试指定使用llvm
?我该怎么做?
--shared
标志与OSX中的dynamic -dynamiclib -undefined dynamic_lookup
标志有什么不同?
Linux内核或发行版是否重要? (我认为他们在CentOS机器上编译得很好)
请帮忙。 非常感谢。
答案 0 :(得分:1)
用gcc 4.4编译并完美无缺地工作。我猜这个订单包的顺序与4.4无关。
答案 1 :(得分:0)
未定义引用类型的错误可能是由未编译的符号,未链接或无序链接引起的。调试它的方法是检查链接器行,链接器抱怨的符号。错误消息可能会告诉您哪个对象文件具有依赖项。
现在,您需要确定符号是否已编译或链接,因为您需要查找它是否在任何目标文件或任何库中以及哪些库中。您可以使用nm
命令行工具列出在任何给定的.o或库中定义的符号。如果符号不在那里,那么你需要弄清楚要添加到链接器行的内容,这将解决它。
如果符号出现在一个库中,则标识哪个库依赖于该符号(来自链接器错误消息)和包含它的库。前者必须在链接器命令行中列在后者之前(假设是静态链接)。
作为一个简单的 hack ,尽管我建议不要使用它,但您可以使用--start-group
和--end-group
command line options指示gcc链接器执行多次传递。虽然我真的建议你弄清楚依赖的顺序,因为这也可以让你更好地了解你的项目。