ZBar:架构 armv7 的未定义符号
ZBar: Undefined symbols for architecture armv7
我在 iOS 8 项目上使用 zBar 库,我收到了这些编译器警告:
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)
我遵循 this suggestion 整理框架,这就是我导入它们的方式:
我假设库 libzbar.a 是为 armv6 处理器创建的,因为我的目标是 iOS 8 与 armv7 它冲突。有没有办法在不更改项目架构目标的情况下解决这个问题?
是的,你是对的'the library libzbar.a was created for armv6 architecture'而不是 armv7。
如果您尝试为 armv7 架构提供支持,那么在这种情况下您需要为 armv7 架构构建库,并且只能由库的开发人员完成(因为构建静态库需要源代码) .
基本上,一个胖(静态库)文件是使用 i386(模拟器)和 armv7(任何必需的体系结构)的静态库创建的,并随静态库的 SDK 一起提供,该静态库可在模拟器和设备上运行。
fat 文件是通过在各个体系结构静态库上执行 lipo 命令创建的。
也许使用原生 iOS 条码扫描器会更好?
我在我的一个项目中也使用了ZBar,但是在iOS 7之后,我开始使用native,并且变得非常高兴:)
设置
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;
}
}
}];
}
尝试在框架中添加libiconv.dylib
。我不认为这是 armv7 问题。添加缺少的框架后应该 运行。
我在 iOS 8 项目上使用 zBar 库,我收到了这些编译器警告:
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)
我遵循 this suggestion 整理框架,这就是我导入它们的方式:
我假设库 libzbar.a 是为 armv6 处理器创建的,因为我的目标是 iOS 8 与 armv7 它冲突。有没有办法在不更改项目架构目标的情况下解决这个问题?
是的,你是对的'the library libzbar.a was created for armv6 architecture'而不是 armv7。
如果您尝试为 armv7 架构提供支持,那么在这种情况下您需要为 armv7 架构构建库,并且只能由库的开发人员完成(因为构建静态库需要源代码) .
基本上,一个胖(静态库)文件是使用 i386(模拟器)和 armv7(任何必需的体系结构)的静态库创建的,并随静态库的 SDK 一起提供,该静态库可在模拟器和设备上运行。
fat 文件是通过在各个体系结构静态库上执行 lipo 命令创建的。
也许使用原生 iOS 条码扫描器会更好? 我在我的一个项目中也使用了ZBar,但是在iOS 7之后,我开始使用native,并且变得非常高兴:)
设置
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;
}
}
}];
}
尝试在框架中添加libiconv.dylib
。我不认为这是 armv7 问题。添加缺少的框架后应该 运行。