2016-06-13 99 views
7

Xcode有時會自動查找依賴關係。我認爲當我是定義關係和懶惰的人時是可以的......Xcode如何找到隱式目標依賴關係?

但是,我經常發現自己正面臨着一個存在多個目標的中型項目。由於該項目已經被別人做我覺得很難理解什麼目標取決於什麼,因爲不是所有的關係是明確的

什麼是規則的Xcode使用找到這樣的關係?(我希望我能理解的邏輯,所以運行它在我的腦海裏,也許救我在未來的一段時間)或者是什麼讓一個目標qualifiable是隱含依賴的另一個?

目標及其創建的產品可能與另一個目標有關。如果一個目標需要另一個目標的輸出來建立,則第一個目標被認爲取決於第二個目標。如果兩個目標位於同一個工作區中,Xcode可以發現依賴關係,在這種情況下,它會按照所需順序構建產品。這種關係被稱爲隱式依賴。

來源:iOS Developer Library → Xcode Concepts → Xcode Target

+0

在同一個工作空間('.proj'內有一個.workspace)或在構建階段添加目標依賴關係。另外,如果一個目標使用另一個目標,Xcode會自動建立另一個目標。 –

+0

我發現隱式目標依賴項無法構建複雜的項目,例如當涉及不同平臺的多個類似命名的框架/庫時。手動指定所有東西是唯一讓我的watchOS/tvOS/iOS項目構建的東西。 – DrMickeyLauer

回答

4

這個答案適用於Xcode的8.x中,我認爲對的Xcode 9.0。

首先,你需要確保「查找隱含相關性」,你正在試圖建立該計劃的生成面板被啓用。

一個目標「A」可以通過兩種方式進行「隱性」依賴目標「B」:

  1. 目標A有一個圖書館在其列表「鏈接二進制與圖書館」建設階段具有同名爲B的產品本產品可以是在同一個項目或工作區中的另一個項目。請注意,我說「同名」。僅僅因爲您從目標A選擇了libA.a並不意味着隱式依賴關係會構建它,前提是您在另一個目標中有另一個libA.a產品。詳情請參閱下文。
  2. 目標A有一個「複製文件階段」,它複製一個文件,其中基本名稱與B的產品相匹配。通常,「複製文件」構建階段不能引用不在同一項目中的文件作爲它的目標,但是如果您爲「複製文件」階段創建一個虛擬文件以複製具有與B產品相同的名稱的虛擬文件,則可以跨項目設置依賴項。例如,如果您的工作空間包含兩個項目ProjectA和ProjectB。 ProjectA具有創建libA.a的TargetA,而ProjectB具有創建libB.a的TargetB。 TargetA能拿TargetB由具有「假」零字節文件TargetA的一部分,正巧被命名libB.a建立libB.a,而這將足以獲得libB.a提出,即使libB.a簡稱到「複製文件」階段是與TargetB構建的產品輸出完全不同的文件。如果您選中「僅在安裝時複製」複選框,則Xcode不會實際執行該複製,但仍會解析依賴關係。實際上,您可以刪除您創建的驅動器中的假文件,只是爲了在「複製文件」階段添加某些內容(但必須將其保留在項目中)。

那麼爲什麼會有人想要做「2」的恐怖?我可以想出幾個理由。

  1. TargetA需要一些由TargetB複製/生成的文件,但TargetB不會生成鏈接到的庫。你可以通過讓TargetB生成一個小型的虛擬庫來解決這個問題,但這可能會因爲其他原因而變得很痛苦。
  2. 假設我有projectA,targetA和libA.a(和項目B,C和D的等價物),libA.a依賴於libB.a和libC.a,這兩個都需要libD.a首先被構建(可能會生成一些頭文件和/或源文件)。您可以使用「Link With Libraries」階段(也就是解決方案#1)完成所有工作,但在這種情況下,最終鏈接的libA版本中最終會有libD中兩個.o文件副本。如果你做得足夠深的話(比如一個有40個項目的工作空間相互依賴程度不同),你將很快得到巨大的庫文件,其中有幾個相同的.o文件,你的鏈接時間將變得可怕。

如果你認爲這些都是人爲設想的情況,我現在正在觸碰他們兩個,將一些遺留代碼從一系列顯式依賴項移動到隱式依賴項。爲什麼我要轉向隱式依賴關係?由於Xcode中的顯式依賴項需要項目嵌套,並且一旦獲得足夠的顯式依賴項,項目瀏覽器變得非常慢,並且您會在Xcode中看到很多隨機事件的沙灘球。

如果碰巧在同一個工作區內有兩個目標生成具有相同名稱的產品並依賴於第三個目標的產品,會發生什麼情況?隱式依賴將選擇一個。它似乎根據產品的基本名稱進行匹配(所以foo/bar.a和baz/bar.a是相同的),並會選取它找到的第一個。