programar desde iphone ios xcode4.2 cross-compiling freetds

iphone - programar en ios desde windows



CompilaciĆ³n cruzada de FreeTDS para iPhone (2)

Como esta pregunta no ha sido respondida y pasé la mayor parte del semestre pensando en ello, pensé en publicar cómo cruzar compilando FreeTDS 0.91 con el iPhone ARMv6, arquitectura ARMv7. Esto se hizo usando Xcode 4.2 y iOS 5 SDK.

El motivo por el que se formula esta pregunta es porque está desarrollando una aplicación para un dispositivo iOS que requiere conectarse a un Servidor SQL de Mircosoft, que requiere el uso del protocolo de Flujo de datos tabulares (TDS) ya que es propiedad de Microsoft.

También mencionaré que necesitas cierto nivel de habilidad técnica para intentar esto. Esta es una versión muy condensada de lo que tardé casi dos meses en descifrar (dejé todas las cosas que no debes hacer).

Otra documentación relacionada con esto:

Instrucciones básicas sobre cómo usar FreeTDS http://www.freetds.org/userguide/samplecode.htm

Documentación de la API TDS de Microsoft http://msdn.microsoft.com/en-us/library/aa936985(v=sql.80)

Ver mi respuesta a continuación.

También vea la respuesta de saskathex para los archivos actualizados de Xcode 4.5.


Para aquellos como yo que pasarán horas buscando la documentación para estos indicadores de configuración estándar (para ejecutar ./configure make make install)

./configure --build is used for specifing the architecture you want to complie for ./configure --host is used to specify the ark of the machine doing the compileing (running xcode) ./configure --target seems to be an alias

Ahora luego a resolver el problema.

1) Obtenga la última versión de FreeTDS http://www.freetds.org/

2) El próximo paso es crear sus propios archivos bash shell que ejecuten correctamente FreeTDS ./configure. Necesitará dos, ya que el simulador es arquitectura i386 / i686 y un dispositivo Apple (iPhone, iPod, etc.) es arquitectura ARM. Además, sus archivos de compilación / versión dentro de los directorios de desarrollo de iPhone pueden ser diferentes, solo busque lo que tenga sentido lógico y tenga una convención de nomenclatura similar. La arquitectura del host mac se suministra con el comando uname -p.

Aquí está mi ejemplo para construir para usar en el simulador (i386) build_for_simulator_i386.sh:

#!/bin/sh #unset some shell variables unset CC unset CFLAGS unset CPP export buildPath=`pwd` # make i386 (Simulator) target export CC=/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/i686-apple-darwin11-llvm-gcc-4.2 export CFLAGS="-isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk" # if you want Windows Authentication (NTLM) support you must use at least tds version 7 # the default is 5 ./configure --build=i386 --host=i386 --target=i386 --with-tdsver=7.1

Ejemplo de configuración para la compilación ARM (build_for_device_armv7.sh):

#!/bin/sh # unset some shell variables unset CC unset CFLAGS unset CPP export buildPath=`pwd` # make arm target export CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 export CFLAGS="-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" export CPP=/usr/bin/cpp ./configure --build=arm-apple-darwin10 --host=x86_64-apple-darwin11.3.0 --target=armv7 --with-tdsver=7.1

3) Siguiente cd al directorio raíz de freetds que resultó de descomprimir la descarga de freetds, el mío era freetds_0.91

4) Ejecuta uno de tus scripts. Solo puedes compilar para UNA arquitectura a la vez

sh build_for_(desiered build) this runs ./configure for you with the correct options (tds version 7 required for NTLM authentication)

5) Una vez que el proceso de configuración se completa, debe hackear el archivo de configuración. Abre freetds_0.91 / include / config.h y luego en la línea 172 cambia #define HAVE_ICONV 1 a #define HAVE_ICONV 0

6) Si anteriormente ejecutó ./configure, make, make install, ejecute estos comandos. Especialmente si sus arquitecturas de conmutación, como se ejecutarán los errores de errores, no harán esto

sudo make clean sudo make uninstall

7) Realice la compilación usando make

make all sudo make install

El procedimiento make realiza algunos errores a propósito, pero si ve errores dentro de las seis o siete líneas del indicador de shell, una vez que vuelve, tiene problemas y necesita repararlos antes de continuar. Solo digamos que muchas cosas pueden salir mal en este punto.

8) Después de instalar el archivo binario compilado que es la culminación de todos los pequeños archivos .o que hace frenos es /usr/local/lib/libsybdb.a. Confía en mí, no quieres extraer un archivo .o solo para la biblioteca usted quiere. Copie /usr/local/lib/libsybdb.a en la carpeta correspondiente de su proyecto. Lo que hice fue tener dos carpetas separadas, una por arquitectura, llamada "compiled_freetds-0.91_simulator_i386" y "compiled_freetds-0.91_device_armv7".

9) Dado que desea simplificarle la vida y hacer que xcode determine qué archivo compilado utilizar, siga este subconjunto de pasos para realizar el enlace dinámico.

a) Select you project settings on the left had side of xcode (the blue think with the name of your project on it) b) Select the Target (usual the same name as your app) c) Navigate to **build settings**, scroll down to **linking > other linker flags** d) On the left side of Other Linker Flags a mouse over will reveal an expander, expanding will reveal Debug and Release rows. e) Add the appriate architectures by selecting the plus on the right side of either Debug or Release. When the new row appears select the architecture, double click the first editable field from the right to open an entry box that you can then drag the appropriate complied file into it to be dynamically linked. You must do this for both files and when done correctly the file under ARMv7 will be used when building for the device and the one for Any iOS Simulator SDK will be used when running on the simulator. **Note:** You may also need to add the -all_load flag to resolve linking issues.

10) El último paso que parece evitar el problema del error de vinculación dinámica que involucra a libsybdb.5.dylib cuando se ejecuta código en un dispositivo es hacer una desinstalación. Además, cuando se ejecuta en el dispositivo también recibirá muchas advertencias, en incrementos de 36, sobre la desaprobación de CPU_SUBTYPE_ARM_ALL, que es normal, pero molesto.

sudo make uninstall

Espero que esto ayude.


Usé los archivos bash anteriores, pero desde XCode 4.5, las herramientas para desarrolladores están dentro del paquete de la aplicación. Así que modifiqué los scripts para ejecutarlos con mi MacOS Lion y la versión actual de XCode "4.5.2 (4G2008a)"

build_for_simulator_i386.sh:

#!/bin/sh # unset some shell variables unset CC unset CFLAGS unset CPP # make i386 (Simulator) target export CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/i686-apple-darwin11-llvm-gcc-4.2 export CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk" export CPP=/usr/bin/cpp ./configure -build=i686-apple-darwin11 --host=i686-apple-darwin11 --target=i686-apple-darwin11 --with-tdsver=7.1

build_for_device_armv7.sh:

#!/bin/sh # unset some shell variables unset CC unset CFLAGS unset CPP # make arm target export CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 export CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk" export CPP=/usr/bin/cpp ./configure --build=arm-apple-darwin10 --host=x86_64-apple-darwin11 --target=armv7 --with-tdsver=7.1

Un buen complemento es usar lipinfo para fusionar dos bibliotecas estáticas en una por

lipo compiled_freetds-0.91_device_armv7/libsybdb.a compiled_freetds-0.91_simulator_i386/libsybdb.a -create -output universal_libsybdb.a

y simplemente agregando esto a la configuración del proyecto.

Quería compartirlo, ya que los guiones anteriores me ahorraron mucho tiempo.