2012-07-11 8 views
32

Poiché questa domanda non ha risposta e ho trascorso la maggior parte del semestre a pensarlo ho pensato di pubblicare come compilare CrossTDS 0.91 su iPhone ARMv6, architettura ARMv7. Questo è stato fatto usando Xcode 4.2 e iOS 5 SDK.Cross compilazione di FreeTDS su iPhone

Il motivo per cui viene posta questa domanda perché si sta sviluppando un'app per un dispositivo iOS che richiede la connessione a un server SQL di Mircosoft, che richiede l'utilizzo del protocollo TDS (Tabular Data Stream) poiché è proprietario di Microsoft.

Vorrei anche menzionare che è necessario un certo livello di abilità tecnica per tentare anche questo. Questa è una versione molto condensata di ciò che mi ci è voluto quasi due mesi per capire (ho lasciato tutte le cose che non dovresti fare).

Altra documentazione relativa al presente:

base Come on utilizzando FreeTDS http://www.freetds.org/userguide/samplecode.htm

documentazione TDS API di Microsoft http://msdn.microsoft.com/en-us/library/aa936985(v=sql.80)

vedi la mia risposta qui di seguito.

Vedere anche risposta saskathex per file aggiornati Xcode 4.5.

+1

Questo è fantastico! Ma ho finito per usare SDK iSQL da mobilefoo. – Hackmodford

+0

@AmigableClarkKant Sarebbe molto più sensato, no? – Tristan

risposta

4

Per quelli come me che trascorrere ore a trovare la documentazione per questi flag configurazioni standard (per l'esecuzione di ./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 

Ora poi alla soluzione del problema.

1) Scarica l'ultima versione dei FreeTDS http://www.freetds.org/

2) Il passo successivo è quello di rendere i propri file di shell bash che vengono eseguiti correttamente il ./configure FreeTDS. Ne avrete bisogno due poiché il simulatore è un'architettura i386/i686 e un dispositivo Apple (iPhone, iPod, ecc.) È un'architettura ARM. Inoltre, i file/versione del compilatore all'interno delle directory di sviluppo di iPhone potrebbero essere diversi, basta trovare ciò che ha senso logico e ha una convenzione di denominazione simile. L'architettura dell'host mac è fornita con il comando uname -p.

Ecco il mio esempio per la costruzione per l'uso sul simulatore (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 

Esempio di configurazione per ARM compilazione (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) Il prossimo cd alla directory freetds di root che risultava dalla decompressione del download di freetds, il mio era freetds_0.91

4) Esegui uno dei tuoi script. È possibile compilare solo per ONE architettura in un momento

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

5) Una volta che il processo di configurazione completa è necessario incidere il file di configurazione. Aprire freetds_0.91/include/config.h allora on line 172 cambiamento #define HAVE_ICONV 1 a #define HAVE_ICONV 0

6) Se è già stato eseguito./ configure, make, make install quindi esegui questi comandi. Specialmente se il passaggio architetture come si ottengono gli errori eseguendo make senza fare questo

sudo make clean 
    sudo make uninstall 

7) Eseguire la compilazione tramite make

make all 
    sudo make install 

La procedura make fa attraverso alcuni errori di proposito, ma se si vede errori entro sei o sette righe di prompt della shell, una volta restituito, si verificano problemi e è necessario correggerli prima di procedere. Diciamo solo che molte cose possono andare storte a questo punto.

8) Dopo aver installato il file rispettato binario che è il culmine di tutti i piccoli file .o che FreeTDS fa è /usr/local/lib/libsybdb.a Fidati di me non si vuole tirare a. o file per la sola libreria che desideri. Copia /usr/local/lib/libsybdb.a nella cartella appropriata del tuo progetto. Quello che ho fatto era avere due cartelle separate, una per architettura, chiamate "compiled_freetds-0.91_simulator_i386" e "compiled_freetds-0.91_device_armv7."

9) Dal momento che si desidera semplificare la vita e avere xcode capire quale file compilato utilizzare seguire questo sottoinsieme di passaggi per eseguire il collegamento dinamico.

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) Il passo finale che sembra evitare problema dell'errore collegamento dinamico che coinvolge libsybdb.5.dylib quando si esegue il codice sul dispositivo è quello di rendere disinstallazione. Inoltre, quando si esegue sul dispositivo si ottengono anche molti avvisi, con incrementi di 36, su CPU_SUBTYPE_ARM_ALL deprecato, che è normale, ma fastidioso.

sudo make uninstall 

Spero che questo aiuti.

+0

So che ci hai messo un sacco di lavoro, quindi mi dispiace dirtelo, ma hai ottenuto gli usi dei parametri --build e --host per ./configure confusi. È viceversa, altrimenti ho frainteso la tua spiegazione. Vedi il link alla fine di questo commento, che lo spiega bene. E --target non è un alias, ma è usato solo quando si costruiscono toolchain, come compilatori o debugger - ad es. quando stai compilando un compilatore. Per qualsiasi altra cosa, --target è irrilevante. http://stackoverflow.com/questions/5139403/whats-the-difference-of-configure-option-build-host-and-target; buona fortuna e buon divertimento! –

3

Ho usato i file bash di cui sopra, ma poiché XCode 4.5 gli Strumenti per sviluppatori si trovano all'interno del pacchetto di app. Così ho modificato gli script da eseguire con il mio MacOS Lion e la corrente XCode versione "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 buon add-on è usare lipinfo per unire due librerie statiche in una di

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

e aggiungendo semplicemente questo alle impostazioni del progetto.

Volevo condividerlo, poiché gli script di cui sopra mi hanno risparmiato un sacco di tempo.