2014-07-21 32 views
0

我正在寫一個框架Stuff.framework(私人使用),依賴於第三方靜態庫libthirdparty.a,但我不想嵌入庫中的框架。這個框架將被SomeApp.app使用(除其他外)。目標C框架與庫依賴,但沒有嵌入

爲了簡短,讓我們假設我們同意嵌入是不好的。

如果我正在編寫一個庫libstuff.a而不是一個框架,我不會將libstuff.a和libthirdparty.a鏈接起來。 SomeApp.app會鏈接到libstuff.a和libthirdparty.a - 沒問題。

此方法不適用於框架。如果Stuff.framework不鏈接libthirdparty.a,則鏈接器會提供「未定義符號」錯誤。如果Stuff.framework鏈接libthirdparty.a,庫的內容就嵌入在框架中,這是我想避免的。

那麼,有誰知道如何實現第一段中所述的目標?我想這是靜態和動態庫之間的區別,但也許有鏈接選項可以解決它。

+0

你試圖要求動態綁定到一個靜態庫。那真的不會發生。靜態鏈接到框架中的庫有什麼問題?而且,鏈接和「嵌入」是不同的概念。我不確定你的意思是嵌入。 – CodaFi

+0

如果答案是「那是不可能的」,那麼很好 - 我不會浪費我的時間。我的理解是靜態庫的代碼被複制到框架中。假設你有兩個使用相同庫的框架,並且都被應用程序使用 - 現在你在應用程序中有重複的符號。更糟糕的是,如果框架使用了不同版本的庫呢?和/或應用程序本身也使用庫?很可能,例如。如果他們都使用給定的日誌庫。 – Adrian

+0

這是OS X,對吧?如果你發佈了一箇中間dylib,你的應用程序將動態地解析符號,這將調用dylib中的集成靜態代碼,而不必處理所有這些共享靜態庫廢話。 – CodaFi

回答

0

動態鏈接到救援!

靜態鏈接靜態庫中的一段代碼的框架將盡可能調用該靜態庫的代碼,而不會污染您的符號空間。即使同一靜態庫的多個副本鏈接到多個框架中,或者甚至當一個框架與應用程序本身也鏈接到的靜態庫的副本鏈接時,仍然有兩個符號副本。其中一個副本對應用程序是本地的,將被調用,另一個副本對於框架是本地的,並且它將會調用它。所以,放鬆一下。鏈接器爲您處理所有必需品。

一般來說,你是對的,嵌入是不好的,但現在只適用於靜態庫,其中你的恐懼將是完全合理的。在這種情況下,鏈接器會有重複的符號集成到庫的多個副本的二進制文件中。它可能只是選擇它看到並繼續前進的第一個,或者它可能會發出重複的符號警告。無論哪種方式,都不好。

+0

使用動態庫確實可以避免這個問題;這並不是我所問的,因爲我被困在靜態庫中是有原因的(Cocoapods,儘管我不想把它作爲Cocoapods的討論)。 (不知道你在第二段中提到的是什麼 - 當你在幾個地方的意思是「動態」時,你會說「靜態」嗎?) – Adrian

+0

Stuff.framework是一個動態庫。這是整個事情的重點。 – CodaFi