XCode 5 - 架构 armv7 的未定义符号:

Posted

技术标签:

【中文标题】XCode 5 - 架构 armv7 的未定义符号:【英文标题】:XCode 5 - Undefined symbols for architecture armv7: 【发布时间】:2014-04-11 15:23:35 【问题描述】:

我自己编译的静态库中的单个类出现此错误。一切正常,我想添加另一个类作为简单的数据传输对象,称为 PPClientData。 错误是:

架构 armv7 的未定义符号: “_OBJC_CLASS_$_PPClientData”,参考来自:objc-class-ref in CPPIntegrationDelegate.o

相关文件包含在库编译目标中,我在(胖)库上使用了 otool -d 并显示

libPPIntegration.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;

我了解链接器试图做什么以及错误提示什么,但我没有看到我错过了什么。有人可以帮忙吗?

【问题讨论】:

Xcode子项目生成的静态库是否嵌入到主项目中? 它是在一个xcode项目中生成的,但它没有嵌入到主项目中。 嗯,那么不确定。如果您将 64 位项目嵌入到 32 位项目中并尝试构建到 64 位设备,则会出现问题。即使 64 位项目支持 32 位,如果启用“仅构建活动架构”(通常用于调试),子项目将不会检查父项目,您将遇到您描述的那种问题.一定有其他事情发生。 唯一改变的是我刚刚将 XCode 更新到最新版本(只是小幅增加)我可能会检查一下。 最新版本的 Xcode 确实改变了 64 位架构的默认设置。我刚刚更新并且不得不更改很多 c++ 代码以允许指向 int 转换的指针失去精度。我敢打赌那是你的问题。 【参考方案1】:

如果您使用的是 Xcode 5.1,请尝试从有效架构中删除 arm64(在构建设置下),并将架构从“标准架构”更改为仅 armv7 和 armv7s。这可能与您有关:how to stop xcode5.1 building for 64bit

【讨论】:

嗯,这是一种方法。将所有类型修复为可移植并实际使 arm64 工作 似乎更可取,但是是的,这可能很耗时。 是的,我同意它更可取。这样做是否最好取决于静态库的优先级和复杂性。 我不明白这与链接器问题有何关系。首先,导致问题的类仅使用 NSString,其次,如果我删除/注释掉该类,则库的其余部分链接正常。第三,它不能链接的符号不是 64 位版本。我可能会尝试排除它。【参考方案2】:

好吧,不是架构导致了问题,而是在某种程度上,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)。

这是否是某种错误或更可能是错误,我有太多的前向声明等。我不确定。

【讨论】:

以上是关于XCode 5 - 架构 armv7 的未定义符号:的主要内容,如果未能解决你的问题,请参考以下文章

XCode - 架构 armv7 arm64 的未定义符号

XCode 4.5.2 的“架构的未定义符号”

build.sh ios 使用 XCode6 Beta6 时生成“架构 armv7 的未定义符号”

无法构建发布应用程序 - 架构 armv7 的未定义符号

架构 armv7 (WebRTC) 的未定义符号

架构 armv7 (WebRTC) 的未定义符号