2011-07-19 172 views
2

我有一個cpp靜態庫,並試圖將其包裝在一個靜態obj-c庫中,以便它從外部看起來就像一個正常的obj-c庫。 我的OBJ-C的lib編譯罰款,但是當我嘗試在一個應用程序我得到下面的連接錯誤使用此lib目錄下:在objc庫中調用包裝的靜態C++庫導致鏈接器錯誤

Apple Mach-O Linker (Id) Error 
Undefined symbols for architecture i386: 
    "operator new(unsigned long)", referenced from: 
... 

所有庫編譯每一個需要的架構罰款。

我的包裝的lib是這樣的:

ObjcLib.h

@interface ObjcLib: NSObject{ 
} 
- (void) doSomething:(NSString*)text; 
@end 

ObjcLib.mm

#import "ObjcLib.h" 
#import "apiFromCppLib.h" 
@interface ObjcLib(){ 
@private 
    cppApiNamespace::BaseApi* api; 
} 
@end 

@implementation ObjcLib 
- (void) doSomething:(NSString*)text{ 
    api = new cppApiNamespace::BaseAPI(); 
} 

在我的應用我加入ObjcLib.a下鏈接二進制與圖書館。此外庫搜索路徑是正確的,但是當我嘗試創建一個與[ObjcLib alloc]的對象時,我得到上面提到的鏈接器錯誤。 我使用XCode4與LLVM編譯器3.0

希望任何人都可以給我一個提示什麼可能是錯誤的,或者如果我的包裝甚至是正確的。

編輯: 在應用程序的構建設置中添加-lstdC++作爲其他鏈接器標誌可解決大量鏈接器錯誤,但不是全部。解決的問題是ObjcLib.h和ObjcLib.mm中的cpp命令。剩下的人是來自BaseAPI內部的一些方法調用。仔細看看這個,關於這個方法所調用的不同於那些可以正確鏈接的其他方法。

回答

5

我不熟悉你的編譯器或項目,但它聽起來像標準庫沒有被鏈接。 -lstdc++選項是否可以解決任何問題?

+0

非常感謝,解決了大部分鏈接錯誤,但仍有一些依然存在。這些基本上是來自cpp lib的調用,將會更深入地瞭解這些將它們分隔開來的方式。 :-) – Schaltfehler

+0

總計解決了我的問題,再次感謝!其餘的錯誤是由於某些部分確實缺失造成的。有人從lib-build中隨機排除一些文件。無論如何,現在工作正常^^ – Schaltfehler