我从一个静态库中得到了一个类的错误,我已经自己编译了这个库。它一直工作得很好,我想添加另一个类作为一个简单的数据传输对象,名为PPClientData。错误是:
架构armv7的未定义符号:"_OBJC_CLASS_$_PPClientData",来自: objc-class-ref的cpIntegrationDelegate.o中的引用
相关文件包含在库编译目标中,我在(fat)库中使用了otool -d,它显示了
A(PPClientData.o)(体系结构armv7):(__DATA,--data)部分
应用程序中包含的类(PPClientData.h)的头部如下所示:
#import <Foundation/Foundation.h>
@interface PPClientData : NSObject
@property(nonatomic, strong) NSString* clientId;
// 3 others identical to the above with different names
@end应该编译到库中的.m文件如下所示:
#import "PPClientData.h"
@implementation PPClientData
@synthesize clientId;
//Synthesize others
-(id)init {
self = [super init];
return self;
}
@end它在应用程序中的单个类中使用,如下所示。如果使用它的这个函数被注释掉,链接器错误就会消失(它会链接到库中的其他类),但是这样做会失败。这是库的委托函数。
#import "CPPIntegrationDelegate.h"
#import "PPClientData.h"
@implementation CPPIntegrationDelegate
// Various other functions that work fine
-(PPClientData*)clientData:(PPIntegration*)integration {
PPClientData* dict = [[PPClientData alloc]init]; // This is the line that causes the linker error
dict.clientId = @"whatever";
// set other properties of dict
return dict;
}我理解链接器试图做什么,以及错误意味着什么,但我不知道我错过了什么。有人能帮忙吗?
发布于 2014-04-22 16:13:06
这并不是导致问题的架构,而是xcode或其他方面被我所使用的类的前向声明的顺序和定义本身所混淆。最初,被破坏的代码如下所示:
BrokenClass.h
// Definitions etc.GoodClass.h
@class BrokenClass;
- (BrokenClass*)someMethod:(SomeType*) param;GoodClass.m
#import "BrokenClass.h"
- (BrokenClass*)someMethod:(SomeType*) param
{
}它是通过将GoodClass.h包含到头文件中而被包含到我的应用程序中的,头文件转发声明的BrokenClass,然后将BrokenClass.h包含到一个应该已经完成定义的m文件中,在这个文件中使用该类。
无论如何,为了修复它,我将GoodClass代码更改为:
GoodClass.h
#import "BrokenClass.h"
- (BrokenClass*)someMethod:(SomeType*) param;删除m文件中的#import,然后在我的应用程序中只包含一个GoodClass.h (它引入了BrokenClass)。
不管这是个错误,还是更有可能,我有太多的前向声明等等,我不确定。
发布于 2014-04-11 17:53:48
如果使用Xcode 5.1,请尝试从有效的体系结构(在构建设置下)中删除arm64,并将体系结构从“标准体系结构”更改为只有armv7和armv7s。这可能与您相关:how to stop xcode5.1 building for 64bit
https://stackoverflow.com/questions/23016635
复制相似问题