ZBar: неопределенные символы для архитектуры armv7

Я использую библиотеку zBar в проекте iOS 8 и получаю следующие предупреждения компилятора:

Undefined symbols for architecture armv7:
  "_iconv", referenced from:
      _qr_code_data_list_extract_text in libzbar.a(qrdectxt.o)
  "_iconv_open", referenced from:
      _qr_code_data_list_extract_text in libzbar.a(qrdectxt.o)
  "_iconv_close", referenced from:
      _qr_code_data_list_extract_text in libzbar.a(qrdectxt.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я последовал этому предложению, упорядочив фреймворки, и вот как я их импортирую:

Я предполагаю, что библиотека libzbar.a была создана для процессоров armv6, и, поскольку я ориентируюсь на iOS 8 с armv7, она конфликтует. Есть ли способ решить эту проблему без изменения целей архитектуры моего проекта?

3 ответа

Решение

Попробуй добавить libiconv.dylib в рамках. Я не думаю, что это проблема armv7. Он должен работать после добавления отсутствующего фреймворка.

Может быть, использование родного iOS сканера штрих-кода будет лучшим вариантом? Я также использовал ZBar в одном из моих проектов, но после iOS 7 я начал использовать native, и стал очень счастлив:)

http://www.infragistics.com/community/blogs/torrey-betts/archive/2013/10/10/scanning-barcodes-with-ios-7-objective-c.aspx

Настроить

self.output = [[AVCaptureMetadataOutput alloc] init];
dispatch_queue_t metadataQueue = dispatch_queue_create("com.youproject.capturebarcode", 0);

[self.output setMetadataObjectsDelegate:self queue:metadataQueue];
if ([self.session canAddOutput:self.output]) {
    [self.session addOutput:self.output];
}

И обрабатывать код делегата

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    [metadataObjects enumerateObjectsUsingBlock:^(AVMetadataObject *obj, NSUInteger idx, BOOL *stop) {
     if ([obj isKindOfClass:[AVMetadataMachineReadableCodeObject class]]) {
         AVMetadataMachineReadableCodeObject *code = (AVMetadataMachineReadableCodeObject *) [self.layer transformedMetadataObjectForMetadataObject:obj];
         if ([self.delegate respondsToSelector:@selector(barcodeReader:didReadBarcode:)]) {
             [self.delegate barcodeReader:self didReadBarcode:code.stringValue];
             self.delegate = nil;
         }
     }
    }];
}

Да, вы правы - библиотека libzbar.a создана для архитектуры armv6, а не для armv7.

Если вы пытаетесь обеспечить поддержку архитектуры armv7, то в этом случае вам нужно собрать библиотеку для архитектуры armv7, и это может сделать только разработчик библиотеки (поскольку для сборки статической библиотеки требуется источник).

По сути, толстый файл (статическая библиотека) создается с использованием статических библиотек для i386(симулятор) и armv7(любые необходимые архитектуры) и поставляется с SDK статической библиотеки, которая работает как на симуляторе, так и на устройстве.

Файл fat создается путем выполнения команды lipo в статических библиотеках отдельных архитектур.

Другие вопросы по тегам