【问题标题】:Apple Mach O Linker warningApple Mach O 链接器警告
【发布时间】:2012-01-18 09:03:30
【问题描述】:

我收到了这个烦人的警告

Apple Mach-O 链接器警告 合并暂定定义 _searchFlag 时对齐丢失

我已经像这样在 constant.h 文件中声明了搜索标志

BOOL 搜索标志

过去 2 天我一直在解决这个问题,我已经尝试了 google 提供的所有可能的解决方案,但似乎没有一个有效。

我的应用同时支持 armv6 和 v7 arch,我已经为其添加了设置,但这个问题似乎是问题所在,它只是这个 bool 标志自 2 天以来一直在咬我的头。

请帮我解决这个问题 谢谢

【问题讨论】:

  • @Geoffroy:我只是在 constant.h 文件中声明标志,它们与其中的代码完全不同。
  • 那里没有分号。但如果这不是问题,那么它可能只是 Xcode 与你搞混了。尝试在 .m 文件中实现并告诉我它是如何进行的。

标签: objective-c xcode4 linker mach-o


【解决方案1】:

我的猜测是您将此头文件包含在多个源文件中。如粘贴在此处,这将产生多个名为 _searchFlag 的符号,每个包含一个标头。

这里的常用模式,假设您尝试声明一个名为 searchFlag 的类型为 BOOL 的全局变量,您可以从多个源文件中访问该变量,将使用关键字 extern 在标头中声明它,然后在只有一个源文件中定义它。

头文件(例如称为“Foo.h”):

extern BOOL searchFlag;

一个源文件(例如“Foo.m”):

BOOL searchFlag;

许多源文件/头文件:

#import "Foo.h";

如果没有extern,从技术上讲,您是在包含/导入标头的每个源文件中重新声明它。

【讨论】:

  • 我喜欢这个答案。我要补充一点,该标志被定义为一个常量,因为 OP 提到该变量在常量文件中。 Foo.h:extern const BOOL searchFlag; 和 Foo.m:const BOOL searchFlag = true;
【解决方案2】:

标头中的全局变量在 ObjC 中是不好的 juju;我不会对全局变量的使用做出判断(因为它们有时确实是必要的),但我会以不同的方式声明它们。

我能想到的最简洁和最简单的方法(也是我的首选方法)是创建一个新类,将全局变量的访问器实现为类方法,并将变量本身声明为源文件中的静态变量。

myglobal.h

@interface MyGlobal : Object
{
}

+ (BOOL)searchFlag;
+ (void)setSearchFlag:(BOOL)aFlag;

@end


myglobal.m

#import "myglobal.h"

// Static variables
static BOOL _searchFlag = NO;

@implementation MyGlobal

+ (BOOL)searchFlag
{
    return _searchFlag;
}

+ (void)setSearchFlag:(BOOL)aFlag
{
    _searchFlag = aFlag;
}

@end

使用这种方法,访问全局变量就像[MyGlobal searchFlag][MyGlobal setSearchFlag: YES] 一样简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多