Cross compilation FreeTDS pour iPhone
Comme cette question Est sans réponse et que j'ai passé la majorité d'un semestre à la comprendre, j'ai pensé poster comment compiler FreeTDS 0.91 pour iPhone ARMv6, ARMv7 architecture. Cela a été fait en utilisant Xcode 4.2 et IOS 5 SDK.
La raison pour laquelle cette question est posée parce que vous développez une application pour un appareil iOS qui nécessite une connexion à un serveur Mircosoft SQL, ce qui nécessite l'utilisation du protocole Tabular Data Stream (TDS) car il est propriétaire de Microsoft.
Je vais mentionnez également que vous avez besoin d'un certain niveau de compétence technique pour même tenter cela. C'est une version très condensée de ce qui m'a pris près de deux mois pour comprendre (j'ai laissé toutes les choses que vous ne devriez pas faire).
Autres documents relatifs à ceci:
Basic comment utiliser 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 dessous.
Voir aussi la réponse saskathex pour les fichiers mis à jour Xcode 4.5.
2 réponses
Pour ceux comme moi qui vont passer des heures à trouver la documentation pour ces drapeaux de configuration standard (pour l'exécution ./ 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
Maintenant, à résoudre le problème.
1) Obtenez la dernière version des FreeTDS http://www.freetds.org/
2) l'étape suivante consiste à créer vos propres fichiers shell bash qui exécutent correctement les FreeTDS ./configurer. Vous en aurez besoin de deux car le simulateur est l'architecture i386 / i686 et un appareil apple (iPhone, iPod, etc.) est l'architecture ARM. En outre, vos fichiers/versions du compilateur dans les répertoires de développement de l'iPhone peuvent être différents, il suffit de trouver ce qui est logique et a une convention de nommage similaire. L'architecture hôte mac est fournie avec 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) prochain cd à la racine répertoire freetds qui a résulté de la décompression du téléchargement freetds, le mien était freetds_0. 91
4) exécutez un de vos scripts. Vous ne pouvez compiler que pour une 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 en # define HAVE_ICONV 0
6) Si vous avez déjà couru ./configure, make, make install puis exécutez ces commandes. Surtout si vos architectures de commutation comme vous obtiendrez des erreurs en cours d'exécution font sans faire cela
sudo make clean
sudo make uninstall
7) effectuez la compilation en utilisant make
make all
sudo make install
La procédure make fait une erreur exprès, mais si vous voyez des erreurs dans les six ou sept lignes de l'invite du shell, une fois qu'elle revient, vous avez des problèmes et devez les corriger avant de continuer. Disons juste que beaucoup de choses peuvent mal tourner à ce stade.
8) Après l'installation du binaire respecté fichier qui est le point culminant de tous les petits.o les fichiers créés par freetds sont / usr/local/lib / libsybdb.a croyez-moi, vous ne voulez pas tirer un .o classez uniquement la bibliothèque que vous voulez. Copiez /usr / local / lib/libsybdb.a dans le dossier approprié de votre projet. Ce que j'ai fait était d'avoir deux dossiers distincts, un par architecture, nommé "compiled_freetds-0. 91_simulator_i386" et " compiled_freetds-0. 91_device_armv7."
9) Puisque vous voulez vous rendre la vie facile et xcode comprendre quel 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 l'appareil est de faire désinstaller. En outre, lors de l'exécution sur l'appareil, vous obtiendrez également beaucoup d'avertissements, par incréments de 36, sur CPU_SUBTYPE_ARM_ALL étant obsolète, c'est normal, mais ennuyeux.
sudo make uninstall
J'espère que cela aide.
J'ai utilisé les fichiers bash ci-dessus, mais depuis XCode 4.5, les outils de développement se trouvent dans le bundle de l'application. J'ai donc modifié les scripts pour les exécuter 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 bon add-on consiste à utiliser lipinfo pour fusionner deux bibliothèques statiques en une seule par
lipo compiled_freetds-0.91_device_armv7/libsybdb.a compiled_freetds-0.91_simulator_i386/libsybdb.a -create -output universal_libsybdb.a
Et juste en ajoutant ceci aux paramètres du projet.
Voulait le partager, puisque ce qui précède les scripts m'ont sauvé beaucoup de temps.