2010-10-23 11 views
8

Estoy intentando construir una biblioteca estática que pueda usar tanto con ios3.x como con ios4.x. Puedo construir una biblioteca estática con ios3.0 que funcione con otro proyecto en ios3.0 pero no compilará en ios4. Lo mismo es cierto yendo de ios4 a ios3.Cómo construir una biblioteca estática universal de ios

Así es como volver a crear:

  1. abierto XCode 3.2.4 y empezar un nuevo proyecto que es una biblioteca estática Cocoa Touch llama Library4
  2. Haga clic en la carpeta de clases y crear un nuevo UIViewController llamado "TestViewController"
  3. Haga clic derecho en la carpeta de Frameworks, agregue el marco existente, elija UIKit
  4. En el panel izquierdo, expanda los objetivos, haga clic derecho en el objetivo de mi biblioteca y haga clic en obtener información. Cambie a todas las configuraciones, cambie la base SDK a iPhone Simulator 4.0, cambie el destino de despliegue iOS a ios3.0
  5. Haga clic en la Biblioteca de enlaces con la carpeta Binarios. En el panel derecho, cambiar los roles de ambos para "débil"
  6. crear la biblioteca
  7. Abra Xcode 3.2.2 y comenzar una nueva aplicación basada en la vista llamada Library4Test
  8. Copia TestViewController.h a las clases carpeta
  9. Copie el archivo libLibrary4.a a la carpeta de marcos. Se agrega automáticamente a la fase del vinculador del destino
  10. Haga clic con el botón derecho en el objetivo Library4Test y haga clic en get info. En otras banderas de engarce, añadir "-ObjC" y "-all_load"
  11. en la cabecera de aplicación delegado añadir importación "TestViewController.h"
  12. en el Método didFinishLaunchingWithOptions de aplicación de la cabecera delegado de la aplicación añadir

    TestViewController * Prueba = [TestViewController alloc] init;

  13. Compilar con el simulador de ios3.0

cuando compilo me sale:

Ld build/Debug-iphonesimulator/library4Test.app/library4Test normal i386 
cd /Users/test/Documents/Testing/library4Test 
setenv MACOSX_DEPLOYMENT_TARGET 10.5 
setenv PATH "/Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/GrandpaIPhone/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" 
/Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk -L/Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator -L/Users/test/Documents/Testing/library4Test -F/Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator -filelist /Users/test/Documents/Testing/library4Test/build/library4Test.build/Debug-iphonesimulator/library4Test.build/Objects-normal/i386/library4Test.LinkFileList -mmacosx-version-min=10.5 -framework Foundation -framework UIKit -framework CoreGraphics -llibrary4_1 -o /Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator/library4Test.app/library4Test 

Undefined symbols: 
"_objc_msgSendSuper2", referenced from: 
-TestViewController didReceiveMemoryWarning in liblibrary4_1.a(TestViewController.o) 
-TestViewController viewDidUnload in liblibrary4_1.a(TestViewController.o) 
-TestViewController dealloc in liblibrary4_1.a(TestViewController.o) 
"__objc_empty_vtable", referenced from: 
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
_OBJC_CLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
"_OBJC_CLASS_$_UIViewController", referenced from: 
_OBJC_CLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
"_OBJC_METACLASS_$_UIViewController", referenced from: 
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
".objc_class_name_TestViewController", referenced from: 
[email protected][email protected][email protected] in library4_1os3TestAppDelegate.o 
"_OBJC_METACLASS_$_NSObject", referenced from: 
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
+0

Para las personas que solo buscan construir una lib de IOS estática: http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4 –

Respuesta

2

No estoy seguro exactamente, pero se ve como un problema de vinculación (todos los .o cosas). Así es como configuré mi biblioteca estática de iOS. Es algo muy simple, pero funciona.

  1. iniciar un nuevo proyecto y seleccione iOS libarary >> Cocoa Touch biblioteca estática
  2. Añadir algunas clases. Las mías son categorías en UIView que dan mejores descripciones para usar en NSLog.
  3. Seleccione el objetivo y asegúrese de que el Rol de cada clase esté configurado en un valor apropiado. En el caso de mis categorías que deberían ser 'públicas'.
  4. Haga doble clic en el objetivo y seleccione la pestaña Generar.
  5. seleccione la versión de configuración y defina las siguientes configuración de creación:
  6. ubicación de implementación Sí (cheque)
    despliegue Postprocessing Sí (cheque)
    Instalación Construir Productos Ubicación/

Construye tu biblioteca estática. Por defecto se compilará en/usr/local/lib

Ahora cree un enlace simbólico para acceder fácilmente a su nueva biblioteca. Una manera fácil es abrir su terminal y ejecute los siguientes comandos:

cd ~  
ln -s /usr/local/lib 

Ahora abra el proyecto de Xcode en el que desea utilizar su biblioteca. Cree un grupo llamado Libraries o algo así, ctrl-click y use 'Agregar archivos existentes' para agregar la biblioteca. Se llamará algo así como libYourLibrary.a Cuando ejecuta su proyecto, obtendrá un error de enlace. Así doble clic en el archivo de proyecto , vaya a construir >> Todas las configuraciones y agregue el siguiente valor al ajuste "Biblioteca de rutas de búsqueda": ~/lib

+0

Acabo de creó una pregunta que puede estar respondiendo aquí, pero no estoy seguro. Aquí está: http://stackoverflow.com/q/26597889/1735836 – Patricia

0

manera que acaba de crear un objetivo por el SDK? Creé una biblioteca estática para iOS-OSx y el procedimiento fue mucho más simple.

  1. crear el proyecto (de plantilla de iOS "toque de cacao biblioteca estática")
  2. añadir los archivos de origen
  3. añadir una meta para SDK

Por supuesto que hay que añadir un poco de

#if TARGET_OS_IPHONE 
... 
#else 
... 
#endif 

al código. Puede agregar sus propios condicionales.

0

Los errores del compilador están sucediendo porque no se vinculó con los marcos del sistema correctos. Todos los símbolos en rojo oscuro son de Foundation.framework, UIKit.framework y libobjc.dylib.

Las bibliotecas estáticas no extraen automáticamente los marcos necesarios con los que deben establecer un vínculo, por lo que cuando los utilice, debe agregarlos al proyecto usted mismo.

Cuestiones relacionadas