ld проверка загрузки / сохранения не удалась при использовании LTO, но не предоставлено много информации - PullRequest
0 голосов
/ 16 октября 2018

После обновления до Xcode 10 наша кодовая база C ++ не связывается при сборке с -Os и -flto.Предоставляется следующая ошибка:

ld: Explicit load/store type does not match pointee type of pointer operand (Producer: 'APPLE_1_1000.11.45.2_0' Reader: 'LLVM APPLE_1_1000.11.45.2_0') for architecture x86_64

(такая же ошибка возникает в последней Xcode 10.1 Beta 3)

Тот же код прекрасно работает с Xcode 9. К сожалениюкомпоновщик не предоставляет больше информации, чем выплевывает вышеприведенное сообщение об ошибке.Некоторая информация об объектном файле будет полезна при попытке точно определить источник проблемы.Удаление -flto устраняет ошибку…

У кого-нибудь есть какие-либо предложения / идеи по отладке?Мы попытались использовать «--trace» с ld, чтобы получить больше информации об обрабатываемых файлах, но сообщение об ошибке просто выводится в середине трассы без видимой корреляции между ошибкой и входным файлом, который печатается при этом.момент.

Все это очень пахнет ошибкой компилятора, и я сообщил об этом Apple через систему отслеживания ошибок.

Любая дополнительная помощь будет принята с благодарностью.Спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

В моем случае, отключив любую оптимизацию -O1,2,3, выплюнул эту ошибку (пока -flto был выключен), я отследил ее до следующей проблемы.Я сделал класс Algo_three - чтобы я мог вернуть 3 значения из функции:

@interface Algo_three<T,V,W> : NSObject{
@public
    T p_0;
    V p_1;
    W p_2;
}

+ (Algo_three<T,V,W>*) first:(T) f second:(V) s third:(W) t;
@end

И я использовал его следующим образом (в файле .m)

+(Algo_three<NSManagedObjectContext*,NSManagedObjectContext*,NSError*>*) CreateCDContexts: ....
{
    return [Algo_three first:ui_managedObjectContext second:sync_managedObjectContext third:nil];
}

Получение 3 значений- это тоже хорошо ..

Algo_three<NSManagedObjectContext*,NSManagedObjectContext*,NSError*> * two_contexts = [not_important_class CreateCDContexts: ... ];

//and here is accessing
self->ui_context = (NSManagedObjectContext*) two_contexts->p_0; //getting 1st value
self->sync_context = (NSManagedObjectContext*) two_contexts->p_1; //2nd value

Комментирование последних двух строк устранило ошибку!Поэтому я добавил три свойства доступа к классу Algo_three, и это сработало.Класс Algo_three выглядит следующим образом (.h).

@interface Algo_three<T,V,W> : NSObject{
@public
    T p_0;
    V p_1;
    W p_2;
}
@property (strong,nonatomic) T first;
@property (strong,nonatomic) V second;
@property (strong,nonatomic) W third;

+ (Algo_three<T,V,W>*) first:(T) f second:(V) s third:(W) t;
@end

Реализация этих свойств (.m):

- (id) first{
    return p_0;
}
-(void) setFirst:(id) obj{
    self->p_0 = obj;
}
- (id) second{
    return p_1;
}
-(void) setSecond:(id) obj{
    self->p_1 = obj;
}
- (id) third{
    return p_2;
}
-(void) setThird:(id) obj{
    self->p_2 = obj;
}

и вместо -> p_0 доступ осуществляется через свойства .first, .second

self->ui_context = (NSManagedObjectContext*) two_contexts.first;
self->sync_context = (NSManagedObjectContext*) two_contexts.second;

Наконец, я признаю - этот компилятор сказал мне, в каком файле находится ошибка, хотя и не очень ясно.XCode 10.1 (10B61).Я внимательно изучил файл, который был непосредственно перед ошибкой компилятора, - я подтвердил его, запустив архив из командной строки:

xcodebuild -scheme MY_PROJ archive
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...