2013-07-18 144 views
0

A是靜態庫。 B是使用A庫的靜態庫。 C是同時使用AB庫的應用程序。重複符號(項目使用庫使用與項目相同的庫)

C中帶有重複符號的問題很明顯。

什麼是適當的(官方)解決方案來避免此問題。我真的想在B中使用A。所有AB,C是一個Xcode工作區中的我的項目。

+2

靜態庫直接編譯到可執行文件/庫中,所以不需要將'C'與'A'鏈接起來。在'B'中使用'A',並在應用程序中使用'B',但不要直接將'A'與應用程序鏈接。只需包含來自'A'的標題;你不需要單獨鏈接它,因爲它已經包含在'B'中。 – Greg

+1

爲什麼不公開庫文件A的頭文件只有在C中,而不是將其包含在工作區中?庫B與庫A一起編譯,因此您必須能夠在C中使用A而無需單獨包含它。 PS:我沒有嘗試過,只是一個建議。 –

+0

謝謝。如果您將評論切換爲回答,我會接受它。 – user500

回答

0

@PartiallyFinite回答我的問題。不幸的是在評論。由於他沒有迴應他的評論答案,我可以接受,所以我引用他來解決這個問題。

「靜態庫直接編譯成可執行/庫,這樣你就不會需要A鏈接C。在B使用A,並在你的應用程序中使用B,但不直接與您的應用程序鏈接A 。只需包含來自A的標題;因爲它已包含在B中,所以不需要單獨鏈接它。「

0

問題時與進口即

#import "A.h" 
#import "B.h" 
#import "C.h" 

在彼此的接口..更好的辦法來避免方案未導入.h文件中的接口類,而不是你可以很容易做到

@class A; 
@class B; 
@class C; 

,並在.m文件中導入各自的.h類。

因此,它應該是這樣的

A.h

@class B; 
@class C; 

@interface A : NSObject 

@end 

A.m

#import "B.h" 
#import "C.h" 
@implementation A 

@end 
+0

這個答案的前提是錯誤的。 '#import'(與'#include'相對)確保每個頭文件只被導入*一次,僅一次*。這不是問題的原因,鏈接似乎是。另一方面,在頭文件中使用'@class X;'作爲反向導入整個頭文件的建議是一個很好的建議(但請注意,有時從頭文件中導入頭文件是不可避免的,例如從另一個類繼承或使用外部定義的協議)。 –

+0

這不是一個錯誤的答案,這可以平滑且高效地解決重複條目的問題。@rsanchezsaez您是否嘗試過證明它錯誤的解決方案? – iphonic

+0

我澄清了一下我的評論。我不想苛刻,因爲我認爲這個答案實際上是一個很好的建議。 –

相關問題