ios - Símbolos indefinidos para la arquitectura armv7 cuando se usa la biblioteca ZXing en XCode 4.5
cocoa-touch ios6 (7)
Lo que trato de hacer
Integrar Zxing , marco de lector de códigos QR, en mi proyecto de iPhone. Revisé ZXing SDK desde here . Ejecuté el proyecto de muestra que viene con ZXing, llamado ScanTest, sin ningún problema. Pero cuando trato de integrar la biblioteca con mi proyecto, me aparece el error mencionado.
Especificación del proyecto
- Sistema operativo objetivo : iOS 6.0
- Objetivo de implementación : iOS 5.0 o superior.
- Probado en : iPhone 4 e iPhone 3GS.
- XCode : Xcode 4.5.1
- Versión ZXing : 2.0
Problema
Cuando construyo, después de realizar todos los pasos de integración en el archivo LXE readme , obtengo errores de compilación como
Undefined symbols for architecture armv7:
"std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
zxing::qrcode::Detector::computeDimension(zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, float) in libZXingWidget.a(Detector-B8B28E953F840D47.o)
Undefined symbols for architecture armv7:
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
zxing::Exception::Exception(char const*) in libZXingWidget.a(Exception.o)
zxing::common::StringUtils::guessEncoding(unsigned char*, int, std::map<unsigned int, std::string, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::string> > >
Hay 27 errores como ese ... Solo copié los primeros dos.
¿Qué descubrí?
Bueno, pasé por this , this , this , this , this , this , this subprocesos en stackoverflow, todo con el mismo mensaje de error. Ninguna de las soluciones funcionó para mí.
Luego encontré este hilo cerrado en los foros de ZXing sobre el mismo tema. De esa discusión, algunas soluciones posibles son (funcionaron para algunos)
El primer error es (probablemente) porque no ha cambiado el nombre de main.m a main.mm. El segundo error es (probablemente) porque no está enlazando con la biblioteca de widgets
También cambié el nombre de mi main.m, comprobé si había agregado la biblioteca solo para encontrar que seguramente tenía. Entonces este no es el caso.
Después de cambiar las Arquitecturas de la biblioteca a "Estándar (armv7, armv7s)" para que coincida con mi proyecto principal, pude compilar la aplicación con éxito.
La arquitectura de mi proyecto, destino, proyecto de biblioteca (para depuración, distribución, lanzamiento) se proporciona como Standard (armv7, armv7s)
. Así que no tuve suerte allí tampoco.
Luego cerraron el problema diciendo esto,
Los proyectos zxing se han actualizado para agregar el arco armv7s y eliminar el arco armv6. Estos cambios son necesarios (1) para construir para el iPhone 5, que es armv7s y (2) para construir, ya que Xcode 4.5 no incluye soporte para armv6. Si tiene sus propios archivos de proyecto, deberá hacer estos cambios usted mismo. Estos son cambios generales no específicos de zxing, por lo que si tiene problemas, puede obtener más o más ayuda en un foro general como StackOverflow.
Así que aquí estoy, en StackOverflow.
Un punto más
En el archivo README de integración de ZXing, el primer paso en la integración es,
1) Busque el archivo "ZXingWidget.xcodeproj" en "
zxing/iphone/ZXingWidget/
". Arrastre ZXingWidget.xcodeproj y suéltelo en la raíz de la barra lateral "Grupos y archivos" de su proyecto Xcode. Aparecerá un cuadro de diálogo: asegúrese de que "Copiar elementos" esté desmarcado y "Tipo de referencia" sea "Relativo al proyecto" antes de hacer clic en "Agregar". Alternativamente, puede hacer clic derecho en su navegador de proyectos y seleccionar ''Agregar archivos a'' MyProject ''''.
Cuando arrastré el archivo ZXingWidget.xcodeproj a mi proyecto, no había ningún diálogo. El proyecto se agregó directamente al proyecto y no pude establecer las propiedades de "copiar elementos" y "Tipo de referencia". No sé si es una nueva característica de xcode 4.5 o un error. Ese es el único paso que no pude seguir correctamente según el archivo README.
Bueno, tienes toda la información que tengo conmigo. Estoy tratando de arreglar esto por 6 horas. ¿Alguna idea?
Bueno, al final lo conseguí trabajando ... Para cualquiera que se encuentre con esto en el futuro ...
Cambie el nombre del archivo main.m a main.mm.
El README de ZXing indica por qué necesitamos esto
Puede suceder que al tratar de crear su propio proyecto con ZXingWidgetController se produzcan errores de enlazador como "referencia indefinida a". Si este error se parece a una referencia indefinida de c ++, el cambio de nombre de main.m a main.mm (sufijo de origen de Objective-C ++) puede solucionar el problema.
Cambie el nombre del archivo (ViewController / View) que usa las funciones de librar de ZXing para que también tenga la extensión .mm.
Compruebe la configuración de la arquitectura en el proyecto. Proporcione arquitectura y una arquitectura válida como armv7 armv7s en la configuración de su proyecto, la configuración de destino y el proyecto ZXing (que agregó a su proyecto principal) y la configuración de destino.
En el proyecto principal -> Configuraciones de compilación, desplácese y descubra las opciones, C ++ Language Dialect y C ++ Standard Library . Seleccione las opciones "Compiler Default" para ambos. (Este es el paso que omití, es necesario porque la plantilla XCode más nueva tiene una configuración predeterminada del compilador diferente a la que tenían en las versiones anteriores).
También es posible que deba establecer el indicador " Construir arquitectura válida solo " de ZXingWidget como
NO
. En mi caso, este campo ya eraNO
Estos solucionaron el problema para mí ...
Actualizar
En diciembre de 2013, Google se retiró del puerto ZXing iOS / Objective C. Por lo tanto, el proyecto Zxing para iOS ya no se mantiene ni se actualiza para las nuevas versiones de iOS. Además, Zxing no admite la arquitectura Arm64, que es una de las arquitecturas estándar según las nuevas versiones de XCode.Así que se anima a los desarrolladores a pasar al marco nativo de Apple para leer el código de barras que está disponible desde iOS7 en adelante. Vea this para un tutorial paso a paso.
Esto resolvió mi problema. Nada más funcionó.
He seguido todas las sugerencias anteriores, y aunque todo compila bien, el enlace falla:
"std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
zxing::qrcode::Detector::computeDimension(zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, float) in libZXingWidget.a(Detector-B8B28E953F840D47.o)
zxing::GridSampler::checkAndNudgePoints(zxing::Ref<zxing::BitMatrix>, std::vector<float, std::allocator<float> >&) in libZXingWidget.a(GridSampler.o)
zxing::qrcode::DecodedBitStreamParser::decodeNumericSegment(zxing::Ref<zxing::BitSource>, std::string&, int) in libZXingWidget.a(DecodedBitStreamParser-64E27B33E79CBC52.o)
zxing::qrcode::Mode::forBits(int) in libZXingWidget.a(Mode.o)
... "std :: ios_base :: Init :: Init ()", a la que se hace referencia desde:
___cxx_global_var_init in libZXingWidget.a(QRCodeReader-F470BE6889D3F76D.o)
___cxx_global_var_init in libZXingWidget.a(Decoder-3DF771F40A970F8E.o)
___cxx_global_var_init in libZXingWidget.a(FormatReader.o)
___cxx_global_var_init in libZXingWidget.a(QRCodeReader-C190599C861BFE46.o)
___cxx_global_var_init in libZXingWidget.a(DecodeHints.o)
___cxx_global_var_init in libZXingWidget.a(BinaryBitmap.o)
___cxx_global_var_init in libZXingWidget.a(DecoderResult.o)
y así...
Estoy ejecutando Xcode 4.5.2. Cambié el nombre de main.m a main.mm, mi controlador de vista también fue renombrado de .m a .mm, la arquitectura en todas partes es "armv7 armv7s".
Suspiro...
Actualizar
Alguien en los paquetes de Apple tenía la respuesta a mi problema:
Parece que no coinciden con las bibliotecas estándar de C ++. La configuración de compilación de su proyecto utiliza la biblioteca estándar de C ++ de clang, pero se compiló libZXingWidget.a para usar la biblioteca estándar GNU C ++.
Pruebe esto: abra ZXingWidget.xcodeproj y establezca la "Biblioteca estándar de C ++" en "libc ++", luego limpie todo y vuelva a generar.
Si eso no funciona, intente configurar "Biblioteca estándar de C ++" en "libstdc ++" tanto en su proyecto como en ZXingWidget.xcodeproj
La primera sugerencia hizo el truco.
He seguido todas las sugerencias anteriores, y aunque todo compila bien, pero sigue fallando, aparece el mensaje de error:
Undefined symbols for architecture armv7:
"_CVPixelBufferLockBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetBytesPerRow", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetWidth", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_kCVPixelBufferPixelFormatTypeKey", referenced from:-[ZXingWidgetController initCapture] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetHeight", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferUnlockBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
entonces, si agrega CoreVideo.framework, la compilación estará bien.
Lo resolví cambiando un valor en el proyecto que arrastraste y dejé caer en xcode.
Conjunto:
Crear arquitectura activa solamente -> Depurar -> No
Espero que ayude a la gente :)!
Revisé todo varias veces y, después de innumerables intentos, resultó que solo necesitaba limpiar mi proyecto. Esto fue necesario después de cambiar C ++ Language Dialect y C ++ Standard Library a Compiler Default. Algo sencillo que hago todo el tiempo pero lo extrañé y perdí 30 minutos.
También puede ser necesario establecer el indicador "Construir arquitectura activa solo" del objetivo ZXingWidget en "NO".