32 votes

Compilation croisée de FreeTDS pour iPhone

Puisque cette question est sans réponse et que j'ai passé la majorité d'un semestre à la résoudre, j'ai pensé que je posterais comment compiler Cross FreeTDS 0.91 pour l'architecture iPhone ARMv6, ARMv7. Ceci a été fait en utilisant Xcode 4.2 et iOS 5 SDK.

La raison pour laquelle cette question est posée est que vous développez une application pour un appareil iOS qui nécessite de se connecter à un serveur SQL Mircosoft, ce qui nécessite d'utiliser le protocole Tabular Data Stream (TDS) car il est propriétaire de Microsoft.

Je précise également qu'il faut avoir un certain niveau de compétences techniques pour tenter de le faire. Voici une version très condensée de ce qui m'a pris près de deux mois à comprendre (j'ai laissé toutes les choses à ne pas faire).

Autres documents relatifs à ce sujet :

Mode d'emploi de base pour l'utilisation de FreeTDS http://www.freetds.org/userguide/samplecode.htm

Documentation de l'API TDS de Microsoft http://msdn.microsoft.com/en-us/library/aa936985(v=sql.80)

Voir ma réponse ci-dessous.

Voir aussi la réponse de saskathex pour les fichiers mis à jour de Xcode 4.5.

4voto

Tristan Points 196

Pour ceux qui, comme moi, passent des heures à trouver la documentation pour ces drapeaux standard de configuration (pour exécuter ./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

Passons maintenant à la résolution du problème.

1) Obtenez la dernière version du FreeTDS http://www.freetds.org/

2) L'étape suivante consiste à créer vos propres fichiers shell bash qui exécutent correctement le fichier FreeTDS ./configure. Vous en aurez besoin de deux car le simulateur a une architecture i386/i686 et un appareil Apple (iPhone, iPod, etc.) a une architecture ARM. De plus, vos fichiers de compilation/version dans les répertoires de développement de l'iPhone peuvent être différents, trouvez simplement ce qui a un sens logique et une convention de dénomination similaire. L'architecture de l'hôte mac est fournie par la commande uname -p.

Voici mon exemple de construction pour une utilisation sur le simulateur (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 

Exemple de configuration pour la compilation 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) Ensuite, allez dans le répertoire racine de freetds qui résulte de la décompression du téléchargement de freetds, le mien était freetds_0.91.

4) Exécutez un de vos scripts. Vous pouvez seulement compiler pour ONE l'architecture à la fois

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

5) Une fois le processus de configuration terminé, vous devez pirater le fichier de configuration. Ouvrez freetds_0.91/include/config.h puis à la ligne 172 changez #define HAVE_ICONV 1 a #define HAVE_ICONV 0

6) Si vous avez précédemment exécuté ./configure, make, make install, exécutez ces commandes. Surtout si vous changez d'architecture, car vous obtiendrez des erreurs en exécutant make sans faire ceci

    sudo make clean
    sudo make uninstall

7) Effectuer la compilation en utilisant make

    make all
    sudo make install

La procédure make provoque volontairement quelques erreurs, mais si vous voyez des erreurs dans les six ou sept lignes de l'invite du shell, une fois qu'il revient, vous avez des problèmes et devez les résoudre avant de continuer. Disons simplement que beaucoup de choses peuvent mal tourner à ce stade.

8) Après l'installation, le fichier binaire compilé qui est le point culminant de tous les petits fichiers .o que freetds crée est le suivant /usr/local/lib/libsybdb.a Croyez-moi, vous ne voulez pas tirer un fichier .o pour la seule bibliothèque que vous voulez. Copiez /usr/local/lib/libsybdb.a dans le dossier approprié de votre projet. Ce que j'ai fait est d'avoir deux dossiers séparés, un par architecture, nommés "compiled_freetds-0.91_simulator_i386" et "compiled_freetds-0.91_device_armv7".

9) Puisque vous voulez vous faciliter la vie et que xcode trouve le fichier compilé à utiliser, suivez ce sous-ensemble d'étapes pour effectuer la liaison dynamique.

 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) La dernière étape qui semble éviter le problème d'erreur de liaison dynamique impliquant libsybdb.5.dylib lors de l'exécution du code sur le périphérique est de faire une désinstallation. En outre, lors de l'exécution sur le périphérique, vous obtiendrez également de nombreux avertissements, par incréments de 36, sur le fait que CPU_SUBTYPE_ARM_ALL est déprécié, ce qui est normal, mais ennuyeux.

    sudo make uninstall  

J'espère que cela vous aidera.

3voto

saskathex Points 39

J'ai utilisé les fichiers bash ci-dessus mais depuis XCode 4.5 les outils de développement sont dans le bundle de l'application. J'ai donc modifié les scripts pour fonctionner avec mon MacOS Lion et la version actuelle 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 complément agréable est l'utilisation de lipinfo pour fusionner deux bibliothèques statiques en une seule.

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

et juste ajouter ceci aux paramètres du projet.

Je voulais le partager, car les scripts ci-dessus m'ont fait gagner beaucoup de temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X