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

Call of a wrapped static c++ library in an objc library causes linker error

本文关键字:错误 c++ 链接 静态 objc 调用 包装      更新时间:2023-10-16

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

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

所有的库在任何需要的架构中都可以很好地编译。

我的包装器库看起来像这样:

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();
}

在我的App中我添加了ObjcLib。链接二进制与库。此外,图书馆搜索路径是正确的,但当我尝试用[ObjcLib alloc]创建对象时,我得到上面提到的链接器错误。我正在使用XCode4与LLVM编译器3.0

希望有人能给我一个提示什么可能是错误的,如果我的包装是正确的。

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

我不熟悉你的编译器或项目,但听起来像标准库没有被链接。-lstdc++选项修复任何东西吗?