Кросс-компиляция библиотек на основе Autotools для официального iPhone SDK
Фон
Я пишу программу, ориентированную на несколько разных телефонов, включая iPhone. Программа зависит от нескольких сторонних библиотек. У меня возникают трудности с кросс-компиляцией этих сторонних библиотек для симулятора iPhone и iPhone. Библиотеки включают Apache Portable Runtime и GNUTLS, а также их зависимости. Я бы хотел, чтобы встроенные библиотеки заканчивались префиксами "/opt/iphone-3.1", "/opt/iphone-3.0", "/opt/iphone-2.2.1", "/opt/iphone-simulator-3.1 "и" /opt/iphone-simulator-3.0 "соответственно.
Чтобы сделать процесс кросс-компиляции легко повторяемым, я создаю сценарии для вызова сценария "configure" для каждой целевой платформы ("iphone3.1-configure", "iphone3.0-configure", "iphone2.2.1" -configure "," iphonesim3.1-configure "и" iphonesim3.0-configure"). Вот где у меня проблемы.
Я использую компьютер Mac OS X 10.6 Snow Leopard с официальным Xcode 3.2 + iPhone SDK 3.1.
Статус
В настоящее время у меня есть следующий скрипт "iphone3.1-configure":
#! / bin / bash # # Программа: iphone3.1-configure # Автор: Майкл Аарон Сафьян # Краткое содержание: # Эта программа запускает скрипт "configure", сгенерированный # Автоинструментами GNU для кросс-компиляции сторонних библиотек # для iPhone 3.1 SDK. Запустите этот сценарий, находясь в каталоге #, содержащем сценарий "configure" для autotools. После запуска этого # вы можете использовать "make" и "sudo make install" для сборки библиотеки. # Используется префикс установки /opt/iphone-3.1/. # unset CPATH unset C_INCLUDE_PATH unset CPLUS_INCLUDE_PATH unset OBJC_INCLUDE_PATH unset LIBS unset DYLD_FALLBACK_LIBRARY_PATH unset DYLD_FALLBACK_FRAMEWORK_PATH экспортировать /SDKs/iPhoneOS$SDKVER.sdk "export PKG_CONFIG_PATH = / Разработчик / Платформы / iPhoneOS.platform / Разработчик / SDKs / iPhoneOS $ SDKVER.sdk / usr / lib / pkgconfig: /Developer/Platforms/iPhoneOS.platform/Developer/ lib / pkgconfig: / opt / iphone- $ SDKVER / lib / pkgconfig: / usr / local / iphone- $ SDKVER / lib / pkgconfig export PREFIX = "/ opt / iphone- $ SDKVER" export AS = "$ DEVROOT / usr / bin / as "export ASCPP =" $ DEVROOT / usr / bin / as "export AR =" $ DEVROOT / usr / bin / ar "export RANLIB =" $ DEVROOT / usr / bin / ranlib "export CPPFLAGS =" - std = c99 -arch armv6 -pipe -no-cpp-precomp --sysroot = '$ SDKROOT' -isystem $ SDKROOT / usr / include -isystem $ DEVROOT / usr / include -isystem / opt / iphone- $ SDKVER / include -isystem / usr / local / iphone- $ SDKVER / include "экспорт CFLAG S = "- std = c99 -arch armv6 -pipe -no-cpp-precomp --sysroot = '$ SDKROOT' -система $ SDKROOT / usr / include -isystem $ DEVROOT / usr / include -isystem / opt / iphone- $ SDKVER / include -isystem / usr / local / iphone- $ SDKVER / include "export CXXFLAGS =" - std = c99 -arch armv6 -pipe -no-cpp-precomp --sysroot = '$ SDKROOT' -isystem $ SDKROOT / usr / include -isystem $ DEVROOT / usr / include -isystem / opt / iphone- $ SDKVER / include -isystem / usr / local / iphone- $ SDKVER / include "export LDFLAGS =" - arch armv6 --sysroot = '$ SDKROOT' -L $ SDKROOT / usr / lib -L $ DEVROOT / usr / lib -L / opt / iphone- $ SDKVER / lib -L / usr / local / iphone- $ SDKVER / lib "export CPP =" $ DEVROOT / usr / bin / cpp-4.2 "export CC =" $ DEVROOT / usr / bin / gcc-4.2 "export CXX =" $ DEVROOT / usr / bin / g ++ - 4.2 "export LD =" $ DEVROOT / usr / bin / ld ", если [! \ (-d "$ DEVROOT" \)]; затем эхо "iPhone SDK не найден. Папка \" $ DEVROOT \ "не существует". выход 1 фай, если [! \ (-d "$ SDKROOT" \)]; затем эхо "iPhone SDK не найден. Папка \" $ SDKROOT \ "не существует". exit 1 fi./configure --prefix = "$ PREFIX" --build = "i386-apple-darwin $ BUILD_DARWIN_VER" --host = "arm-apple-darwin9" --enable-static --disable-shared $ @
В папке "apr-1.3.8" я запускаю "iphone3.1-configure --disable-dso" и получаю:
проверка типа системы сборки... i386-apple-darwin10.0.0 проверка типа хост-системы... arm-apple-darwin9 проверка типа целевой системы... arm-apple-darwin9 Настройка библиотеки APR Платформа: рука-яблоко-дарвин9 проверка на работу mkdir -p... да Версия APR: 1.3.8 проверка выбранного макета... апр проверка наличия arm-apple-darwin9-gcc... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 проверка имени выходного файла компилятора C по умолчанию... a.out проверка работоспособности компилятора C... да проверяем, кросс-компилируем ли мы... да проверка суффикса исполняемых файлов... проверка суффикса объектных файлов... o проверяем, используем ли мы компилятор GNU C... да проверка, принимает ли /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -g... да проверка /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 опции для принятия ISO C89... не поддерживается Применение правил файла подсказок APR для arm-apple-darwin9 добавив "-DDARWIN" в CPPFLAGS добавление "-DSIGPROCMASK_SETS_THREAD_MASK" в CPPFLAGS установка apr_posixsem_is_global в "да" установка ac_cv_func_kqueue на "нет" установка ac_cv_func_poll на "нет" (По умолчанию будет Unix) проверяет, делает ли set наборы $(MAKE)... да проверка того, как запустить препроцессор C... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2 configure: error: в `/Users/michaelsafyan/Downloads/apr-1.3.8': configure: error: C препроцессор "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2" не проходит проверку работоспособности Смотрите `config.log'для более подробной информации.
Соответствующая часть "config.log":
configure: 7710: проверка того, как запустить препроцессор C configure:7828: результат: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2 configure:7857: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.1/include -isystem /usr/local/iphone-3.1/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK conftest.c cpp-4.2: ошибка при попытке выполнить 'cc1': execvp: нет такого файла или каталога:7864: $? = 1 настройка: сбойная программа была: | /* confdefs.h. */ | #define PACKAGE_NAME "" | #define PACKAGE_TARNAME "" | #define PACKAGE_VERSION "" | #define PACKAGE_STRING "" | #define PACKAGE_BUGREPORT "" | /* конец confdefs.h. */ | #ifdef __STDC__ | # включить | #else | # включить | #endif | Синтаксическая ошибка: 7857: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2 -std = c99 -arch armv6 -pipe -no-cpp-precomp --sysroot = '/ Developer / Platforms / iPhoneOS.platform / Developer / SDKs / iPhoneOS3.1.sdk '-isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/ usr / include -isystem /opt/iphone-3.1/include -isystem /usr/local/iphone-3.1/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK conftest.c cpp-4.2: ошибка при попытке выполнить exc 'cc1': execvp: такого файла нет или настройка каталога:7864: $? = 1 настройка: сбойная программа была: | /* confdefs.h. */ | #define PACKAGE_NAME "" | #define PACKAGE_TARNAME "" | #define PACKAGE_VERSION "" | #define PACKAGE_STRING "" | #define PACKAGE_BUGREPORT "" | /* конец confdefs.h. */ | #ifdef __STDC__ | # включить | #else | # включить | #endif | Синтаксическая ошибка configure:7926: ошибка: в `/Users/michaelsafyan/Downloads/apr-1.3.8': configure:7929: ошибка: препроцессор C" /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp- 4.2 "не проходит проверку работоспособности. Смотрите` config.log 'для более подробной информации.
Вопрос
Как исправить скрипт "iphone3.1-configure"? Благодарю.
2 ответа
Хорошо. Это все еще не строит, но это идет намного дальше...
- Препроцессор C не может принимать архитектуру.
- Препроцессор C не принимает --sysroot или -isystem (просто используйте '-I').
- Используйте "cpp" вместо "cpp-4.2" (версия 4.2 неисправна, и, поскольку она является препроцессором, в любом случае не имеет значения, какую версию вы используете, так что вы также можете использовать ту, которая работает).
Обновленная версия скрипта iphone3.1-configure:
#! / bin / bash # # Программа: iphone3.1-configure # Авторы: Майкл Аарон Сафян (michaelsafyan@gmail.com) # Краткий обзор: # Эта программа запускает сценарий "configure", сгенерированный # Autotools # GNU для кросс-компиляции сторонние библиотеки # для iPhone 3.1 SDK. Запустите этот сценарий, находясь в каталоге #, содержащем сценарий "configure" для autotools. После запуска # вы можете использовать "make" и "sudo make install" для сборки библиотеки. # Используется префикс установки /opt/iphone-3.1/. # unset CPATH unset C_INCLUDE_PATH unset CPLUS_INCLUDE_PATH unset OBJC_INCLUDE_PATH unset LIBS unset DYLD_FALLBACK_LIBRARY_PATH unset DYLD_FALLBACK_FRAMEWORK_PATH экспортировать /SDKs/iPhoneOS$SDKVER.sdk" export PKG_CONFIG_PATH=/ Разработчик / Платформы / iPhoneOS.platform / Разработчик /SDKs/iPhoneOS$SDKVER.sdk/usr/lib/pkgconfig:/Developer/Platforms/iPhoneOS.platform/Developer/lib/pkgconfig:/opt/iphone-$SDKVER/lib/pkgconfig:/usr/local/iphone-$SDKVER/lib/pkgconfig export PREFIX="/opt/iphone-$SDKVER" export AS="$DEVROOT/usr/bin/as" export ASCPP="$DEVROOT/usr/bin/as" export AR="$DEVROOT/usr/bin/ar" export RANLIB="$DEVROOT/usr/bin/ranlib" export CPPFLAGS="-pipe -no-cpp-precomp -I$SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -I$SDKROOT/usr/include -I$DEVROOT/usr/include -I/opt/iphone-$SDKVER/include -I/usr/local/iphone-$SDKVER/include" export CFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include" export CXXFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include" export LDFLAGS="-arch armv6 --sysroot='$SDKROOT' -L$SDKROOT/usr/lib -L$DEVROOT/usr/lib -L/opt/iphone-$SDKVER/lib -L/usr/local/iphone-$SDKVER/lib" export CPP="$DEVROOT/usr/bin/cpp" export CXXCPP="$DEVROOT/usr/bin/cpp" export CC="$DEVROOT/usr/bin/gcc-4.2" export CXX="$DEVROOT/usr/bin/g++-4.2" export LD="$DEVROOT/usr/bin/ld"экспорт STRIP="$DEVROOT/usr/bin/strip" if [! \( -d "$DEVROOT" \) ]; затем эхо "iPhone SDK не найден. Папка \"$DEVROOT\"не существует". выход 1 фай, если [! \( -d "$SDKROOT" \) ]; затем эхо "iPhone SDK не найден. Папка \"$SDKROOT\"не существует". выход 1 fi ./configure --prefix="$PREFIX" --build="i386-apple-darwin$BUILD_DARWIN_VER" --host="arm-apple-darwin9" --enable-static --disable-shared ac_cv_file__dev_zero= нет ac_cv_func_setpgrp_void= да $@
Кроме того, я использую "--enable-threads --disable-dso", а не просто "--disable-dso". Это все еще не работает... это терпит неудачу с:
проверка PTHREAD_PROCESS_SHARED в pthread.h... да проверка на pthread_mutexattr_setpshared... да проверка рабочих блокировок PROCESS_SHARED... configure: error: в `/Users/michaelsafyan/Downloads/apr-1.3.8': configure: error: не удается запустить тестовую программу во время кросс-компиляции Смотрите `config.log'для более подробной информации.
Тем не менее, это может быть проблемой с конкретными тестами APR. Я публикую следующий вопрос по ссылке.
редактировать
Я предоставил более полное решение для кросс-компиляции Apache Portable Runtime для iPhone.
Спасибо за ваш сценарий. Это мне очень помогло. Хотя мне пришлось сделать несколько изменений, чтобы архитектура моей встроенной библиотеки arm
и не i386
,
Сначала мне пришлось поменять компилятор:
# export CC="$DEVROOT/usr/bin/gcc-4.2"
export CC="$DEVROOT/usr/bin/arm-apple-darwin10-gcc-4.2.1"
Затем я удалил -arch armv6
вариант, как этот компилятор не понимает, из CFLAGS, CXXFLAGS, LDFLAGS
Обновил версию SDKVER и gcc и все заработало!