Cómo comstackr y usar una biblioteca estática C ++ para la aplicación ios

cómo build una biblioteca estática de object C usando iOS->Framework&Library->Cocoa Touch Static Library en xcode 4.6, y es sencilla con la ayuda de este tutorial Creación de una biblioteca estática en el tutorial de iOS . Una cosa que no estoy seguro, sin embargo, es cómo crear y usar una biblioteca estática C ++ pura para la aplicación io. Para build una biblioteca estática C ++, también utilizo iOS->Framework&Library->Cocoa Touch Static Library , y la diferencia es que elimino todos los files .h y .m al crear el proyecto de biblioteca estática y luego coloco todos los C ++ files de cabeza de biblioteca estática y files de implementación en el proyecto. Un ejemplo muy simple es el siguiente:

Hola h

 #include <iostream> void say_hello(); 

hello.cpp

 #include "hello.h" void say_hello() { std::cout<<"hello"<<std::endl; } 

Parece que funciona y puedo crear hello.a biblioteca estática hello.a para iPhone 6.1 Simulator. El siguiente paso es crear una aplicación que invoque la biblioteca estática. Construyo una simple iOS application->Single View Application para iPhone 6.1 Simulator y luego bash invocar la biblioteca estática hello.a en el file ViewController.mm (cambiar ViewController.m a ViewController.mm para que pueda invocar a la function C ++). con el siguiente código:

 say_hello(); 

Sin embargo, recibí una advertencia y dos posts de error:

Advertencia:

 ld: warning: ignoring file hello.a, file was built for archive which is not the architecture being linked (i386): 

Error 1:

 hello.a Undefined symbols for architecture i386: "say_hello()", referenced from: -[ViewController viewDidLoad] in ViewController.o 

Error 2:

 ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Luego tengo varias preguntas relacionadas con este experimento:

  • ¿Es la forma correcta de crear una biblioteca estática C ++ pura?
  • ¿Hay algún problema con la forma en que invoco la biblioteca estática C ++?

  • En mi ejemplo, al invocar la biblioteca estática, ¿cómo podría resolver los errores del enlace?

Muchas gracias.

Esto lo hara,

1) Cree la biblioteca c ++ de la misma manera, iOS-> Framework & Library-> Cocoa Touch Static Library en Xcode 6.

TestCPlusPlus.h

 int sub(int a, int b); 

TestCPlusPlus.cpp

 int sub(int a, int b) { return a - b; } 

2) Construye la biblioteca estática manteniendo la configuration del dispositivo iOS, luego iPhone 6 (básicamente simulador).

3) luego, expanda Productos en la vista Navegador de files. Seleccione su file .a, diga libTestStaticLibrary.a, luego button derecho> Mostrar en Finder. Muévete en carpetas. Debería poder ver dos páginas Debug-iphoneos y Debug-iphonesimulator

4) ahora abra Terminal vaya hasta esta ruta de Productos y luego escriba

lipo -create Debug-iphoneos / libTestStaticLibrary.a Debug-iphonesimulator / libTestStaticLibrary.a -output libTestStaticLibrary.a

5) Ahora abra su proyecto que utiliza esta biblioteca, debe drag and drop los files de la biblioteca estática, así como los files de encabezado que tienen la function de statement de funciones de la biblioteca estática.

6) Ahora, cree el file de class Touch de Cocoa que actuará como adaptador entre la biblioteca estática y los files obejective -c. Cambia la extensión a .mm

MyCustomAdaptor.h

 @interface MyCustomAdaptor : NSObject -(int)getSub:(int ) a SecondParam:(int) b; @end 

MyCustomAdaptor.mm

 #import "TestCPlusPlus.h" @implementation MyCustomAdaptor -(int)getSub:(int ) a SecondParam:(int) b { int c = sub(a,b); return c; } 

@fin

7) ahora use este MyCustomAdaptor en cualquiera de los files objective c-.

Tenga en count que su .a es una compilation con i386 o armv7? En general, debe build ambas versiones y combinarlas en una sola. así: lipo -create -output libopencore-amrwb.a libopencore-amrwb-armv7.a libopencore-amrwb-i386.a

Actualmente estoy haciendo lo mismo que tú. Tuve el mismo problema que describes aquí, en realidad los mismos dos errores.

Cuando construyas tu biblioteca tienes que tener en count dónde vas a usarla, dispositivo iOS o simulador. Esto es importante porque debes build para los diferentes casos, esto es muy simple, cuando construyas tu biblioteca, simplemente marca el "Seleccionar esquema".

Para uso real del dispositivo:

introduzca la descripción de la imagen aquí

Solo para probar en el simulador use:

introduzca la descripción de la imagen aquí

¡Después de build, simplemente arrastre y suelte los files creados para el proyecto que desea usar la biblioteca y ya está listo!