在objc库中调用包装的静态c ++库会导致链接器错误

时间:2011-07-19 23:49:59

标签: c++ objective-c xcode4 wrapper linker-errors

我有一个cpp静态库,并试图将它包装在一个静态的obj-c库中,以便它从外部看起来像普通的obj-c lib。 我的obj-c lib编译得很好,但是当我尝试在App中使用这个lib时,我得到以下链接器错误:

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

所有libs在每个需要的架构中都可以正常编译。

我的包装器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();
}

在我的应用程序中,我在Link Binary With Libraries下添加了ObjcLib.a。库搜索路径也是正确的,但是当我尝试用[ObjcLib alloc]创建一个对象时,我得到了上面提到的链接器错误。 我正在使用XCode4和LLVM编译器3.0

希望任何人都可以给我一个提示可能是错误的提示,或者我的包装是否正确。

编辑: 在应用程序的构建设置中添加-lstdc ++作为其他链接器标志解决了许多链接器错误,但不是全部。解决的问题是ObjcLib.h和ObjcLib.mm中的cpp命令。保留的是来自BaseAPI的一些方法调用。我们将仔细研究一下这个方法调用与正确链接的其他方法不同的原因。

1 个答案:

答案 0 :(得分:5)

我不熟悉您的编译器或项目,但听起来标准库没有链接。 -lstdc++选项是否可以解决问题?