Compilación cruzada de FreeTDS a iPhone


Dado que esta pregunta no ha sido respondida y pasé la mayor parte de un semestre calculándolo, pensé en publicar cómo compilar FreeTDS 0.91 para iPhone ARMv6, ARMv7 architecture. Esto se hizo usando Xcode 4.2 y iOS 5 SDK.

La razón por la que se hace esta pregunta es porque está desarrollando una aplicación para un dispositivo iOS que requiere conectarse a un servidor Mircosoft SQL, que requiere usar el protocolo Tabular Data Stream (TDS), ya que es propietario de Microsoft.

Lo haré también mencione que necesita algún nivel de habilidad técnica para intentar esto. Esta es una versión muy condensada de lo que me llevó casi dos meses averiguar (dejé todas las cosas que no deberías hacer).

Otra documentación relacionada con esto:

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 debajo.

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

Author: Tristan, 2012-07-11

2 answers

Para aquellos como yo que pasarán horas buscando la documentación para estas banderas 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, a resolver el problema.

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

2) El siguiente paso es crear sus propios archivos de shell bash que ejecuten correctamente los FreeTDS ./configurar. Necesitará dos ya que el simulador es la arquitectura i386/i686 y un dispositivo apple (iPhone, iPod, sucesivamente.) is ARM architecture. Además, sus archivos de compilador / versión dentro de los directorios de desarrollo de iPhone pueden ser diferentes, solo encuentre lo que tiene sentido lógico y tiene una convención de nomenclatura similar. La arquitectura mac host se suministra con el comando uname-p.

Aquí está mi ejemplo para construir para su uso 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 para configurar 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 a la raíz directorio freetds que resultó de descomprimir la descarga de freetds, el mío fue freetds_0. 91

4) Ejecute uno de sus 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 se complete el proceso de configuración, debe hackear el archivo de configuración. Abra freetds_0.91/include/config.h entonces en la línea 172 change # define HAVE_ICONV 1 a #define HAVE_ICONV 0

6) Si se ejecutó previamente ./ configure, make, make install y luego ejecutar estos comandos. Especialmente si sus arquitecturas de conmutación, ya que obtendrá errores que se ejecutan sin hacer esto

    sudo make clean
    sudo make uninstall

7) Realice la compilación usando make

    make all
    sudo make install

El procedimiento make lo hace a través de algún error a propósito, pero si ve errores dentro de seis o siete líneas del prompt del shell, una vez que regrese, tiene problemas y necesita solucionarlos antes de continuar. Digamos que muchas cosas pueden salir mal en este punto.

8) Después de instalar el binario cumplido archivo que es la culminación de todo lo poco .o los archivos que crea freetds son /usr/local/lib/libsybdb.a Confía en mí que no quieres tirar de a .o archivo solo para la biblioteca que desee. Copie / usr / local/lib / libsybdb.a a la carpeta apropiada en su proyecto. Lo que hice fue tener dos carpetas separadas, una por arquitectura, llamadas "compiled_freetds-0.91_simulator_i386" y "compiled_freetds-0.91_device_armv7."

9) Ya que quieres hacerte la vida fácil y tener xcode averiguar qué archivo compilado usar 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 paso final que parece evitar el problema del error de enlace dinámico que involucra a libsybdb.5.dylib cuando se ejecuta el código en el dispositivo es hacer desinstalación. Además, cuando se ejecuta en el dispositivo, también recibirá muchas advertencias, en incrementos de 36, sobre que CPU_SUBTYPE_ARM_ALL está obsoleto, eso es normal, pero molesto.

    sudo make uninstall  

Espero que esto ayude.

 4
Author: Tristan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-16 02:47:50

Usé los archivos bash anteriores, pero desde XCode 4.5 las Herramientas para desarrolladores están dentro del paquete de aplicaciones. Así que modifiqué los scripts para que se ejecutaran 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 añadiendo esto a la configuración del proyecto.

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

 3
Author: saskathex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 08:21:09