Apple Mach O Linker предупреждение - PullRequest
1 голос
/ 17 января 2012

Я получаю это надоедливое предупреждение

Apple Mach-O Linker Warning
Alignment lost in merging tentative definition _searchFlag

Я объявил флаг поиска в файле constant.h, как этот

BOOL searchFlag

Я застрял в этой проблеме сЗа последние 2 дня я попробовал все возможные решения от Google, но ни одно из них, похоже, не работает.

Мое приложение поддерживает как armv6, так и v7 arch, для которого я добавил настройки, но этот вывод, кажется,проблема, это просто этот бул флаг, который кусает мою голову уже 2 дня.

Пожалуйста, помогите мне в этом Спасибо

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Я предполагаю, что вы включаете этот заголовочный файл в несколько исходных файлов.Как показано здесь, это приведет к множеству символов, называемых _searchFlag, по одному для каждого включения заголовка.

Обычный шаблон здесь, если вы пытаетесь объявить глобальную переменную типа BOOL с именемsearchFlag, к которому можно получить доступ из нескольких исходных файлов, будет означать, что он будет объявлен в заголовке с ключевым словом extern, а затем определен в только одном исходном файле.

Заголовокfile (назовите его «Foo.h», например):

extern BOOL searchFlag;

Один исходный файл (например, «Foo.m»):

BOOL searchFlag;

Множество файлов исходного / заголовочного файлов:

#import "Foo.h";

Не имея extern, вы технически повторно декларируете его в каждом исходном файле, в который вы добавляете / импортируете заголовок.

1 голос
/ 18 января 2012

Глобалы в заголовках - это плохие символы в ObjC; Я не делаю суждения об использовании глобалов (поскольку они действительно иногда необходимы), но я бы хотел объявить их по-другому.

Самый чистый и простой способ, который я могу себе представить (и мой предпочтительный метод), - это создать новый класс, который реализует методы доступа для ваших глобальных переменных как методы класса и объявляет сами переменные как статические переменные в исходном файле.

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].

...