2011-04-12 139 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