Подтвердить что ты не робот

Перекрестное компиляция FreeTDS на iPhone

Поскольку этот вопрос остается без ответа, и я провел большую часть семестра, считая это, я думал, что опубликую, как перекрестно компилировать FreeTDS 0.91 в iPhone ARMv6, ARMv7. Это было сделано с использованием Xcode 4.2 и iOS 5 SDK.

Причина этого вопроса задана, потому что вы разрабатываете приложение для устройства iOS, которое требует подключения к Mircosoft SQL Sever, для чего требуется использовать протокол табличного потока данных (TDS), поскольку он принадлежит Microsoft.

Я также упомянул, что вам понадобится некоторый уровень технических навыков, чтобы даже попытаться это сделать. Это очень сжатая версия того, что мне понадобилось почти два месяца, чтобы понять (я оставил все, что вам не нужно делать).

Другая документация, относящаяся к этому:

Основные способы использования FreeTDS http://www.freetds.org/userguide/samplecode.htm

Документация API Microsoft TDS   http://msdn.microsoft.com/en-us/library/aa936985(v=sql.80)

См. мой ответ ниже.

Также см. ответ saskathex для обновленных файлов Xcode 4.5.

4b9b3361

Ответ 1

Для таких, как я, которые будут тратить часы на поиск документации для этих стандартных флагов конфигурации (для запуска. /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

Теперь, чтобы решить проблему.

1) Получите последнюю версию FreeTDS http://www.freetds.org/

2) Следующим шагом является создание собственных файлов оболочки bash, которые правильно запускают FreeTDS./configure. Вам понадобятся два, поскольку имитатором является архитектура i386/i686, а яблочное устройство (iPhone, iPod и т.д.) - это архитектура ARM. Кроме того, ваши файлы/версии компилятора в каталогах разработки iPhone могут быть разными, просто найдите то, что имеет логический смысл и имеет аналогичное соглашение об именах. Архитектура хоста Mac поставляется с командой uname -p.

Вот мой пример построения для использования на симуляторе (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 

Пример настройки для компиляции 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) Далее cd в каталог корневых freetds, который был получен от разархивирования загрузки freetds, мой был freetds_0.91

4) Запустите один из ваших сценариев. Вы можете компилировать только для архитектуры ОДИН

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

5) После завершения процесса настройки вы должны взломать файл конфигурации. Откройте freetds_0.91/include/config.h, затем в строке 172 измените #define HAVE_ICONV 1 на #define HAVE_ICONV 0

6) Если вы ранее запускали. /configure, make, make install, выполните эти команды. Особенно, если ваши коммутационные архитектуры, как вы получите ошибки, выполняются, не делая этого

    sudo make clean
    sudo make uninstall

7) Выполните компиляцию с помощью make

    make all
    sudo make install

Процедура make делает с некоторой ошибкой по назначению, но если вы видите ошибки в шести или семи строках приглашения командной строки, то после ее возвращения у вас возникают проблемы и их исправление перед продолжением. Давайте просто скажем, что в этот момент многое может пойти не так.

8) После установки бинарного файла, который является кульминацией всех небольших файлов .o, которые делают freetds, /usr/local/lib/libsybdb.a Поверьте мне, вы не хотите вытащить файл .o только для нужной библиотеки. Скопируйте файл /usr/local/lib/libsybdb.a в соответствующую папку в вашем проекте. У меня было две отдельные папки, по одной для каждой архитектуры, с именем "compiled_freetds-0.91_simulator_i386" и "compiled_freetds-0.91_device_armv7".

9) Так как вы хотите сделать вашу жизнь легкой и иметь xcode, выяснить, какой скомпилированный файл использовать, следуйте этому подмножеству шагов для выполнения динамической компоновки.

 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) Последний шаг, который, как представляется, позволяет избежать проблемы с динамической ошибкой связывания с использованием libsybdb.5.dylib при запуске кода на устройстве, заключается в том, чтобы удалить. Кроме того, при запуске на устройстве вы также получите множество предупреждений с шагом 36, о том, что CPU_SUBTYPE_ARM_ALL устарел, это нормально, но раздражает.

    sudo make uninstall  

Надеюсь, это поможет.

Ответ 2

Я использовал вышеупомянутые файлы bash, но так как XCode 4.5 Инструменты разработчика находятся внутри пакета приложений. Поэтому я изменил сценарии для работы с моим MacOS Lion и текущей версией 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

Хорошим дополнением является использование lipinfo для объединения двух статических библиотек в один на

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

и просто добавьте это в настройки проекта.

Хотелось поделиться им, так как вышеупомянутые скрипты сэкономили мне много времени.