2011-04-12 204 views
1

有时,如果我们不在makefile中以某种顺序列出库,它将失败。lib依赖关系及其顺序

原因是 - 定义应该在使用之前。

如何确定正确的顺序?

回答

3

实际上,当链接库时,使用应该在定义之前。在处理提供其定义的库文件之前,需要知道任何未解决的符号。

什么问到订单,恐怕您必须手动完成。如果libA依赖于libB(即libA使用来自libB的符号),则必须按以下顺序链接:-lA -lB

这主要是文档问题。一个记录良好的库清楚地说明了它依赖的其他库,因此您可以计算出正确的链接顺序。

如果你不想读文档或没有可用的文件,试错始终是一个选择:)

+0

谢谢。这就是我想确认的,没有任何魔法可以告诉你。 – hari 2011-04-12 21:55:37

1

我发现这是烦人了。我记得寻找一种工具来为我排序,但没有找到任何帮助。

最后,我决定使用暴力破解方法:如果您将两次列出所有库,例如-lA -lB -lA -lB,它将保证每个库都在每个其他库之前(和之后)列出。

因此给定$(LIST)库,您可以使用$(addprefix -l,$(LIST) $(LIST))

不是很优雅,有些放慢链接阶段,但工程。

+0

Hummm,谢谢,但我知道这种方法可以得到* UGLY *如果你有15个库:D – hari 2011-04-12 21:56:05

+0

@hari:你可以使用'--start-group'和'--end-group'选项(或' ('和' - )'),以避免重复。根据[binutils手册](http://sourceware.org/binutils/docs-2.21/ld/Options.html),它具有显着的性能成本。 – eriktous 2011-04-13 03:25:10

+0

@eriktous:是的,最终有人必须确保重复不会发生。 – hari 2011-04-14 01:23:22