Как настроить библиотеку, чтобы она работала в Xcode iOS Simulator? - PullRequest
1 голос
/ 10 января 2012

У меня есть приложение для iPhone, которое работает на устройстве.Теперь мне нужно запустить его в симуляторе.

Он использует проект с открытым исходным кодом (http://site.icu -project.org / ), который я строю из командной строки для создания arm-совместимые .a файлы.Я могу связать их с моим проектом iPhone, и он будет работать на устройстве.

Если я переключу цель на Simulator, сборка завершится неудачно, как я и ожидал:

ld: warning: в libicudata.a файл был создан для неподдерживаемого формата файлов, который не является связываемой архитектурой (i386)

Но если я использую библиотеки, скомпилированные для локального использования (x86_64), я получу та же ошибка , которая должна быть сбита с толку.Нужно ли указывать третью архитектуру для симулятора?Который из?Как настроить конфигурацию?

Для справки, вот как я настроил проект icu для двух разных целей: Как создать ICU, чтобы я мог использовать его в приложении для iPhone?

Отредактировано, чтобы добавить:

Как предложил Гийом (и Подключите приложение iPhone к PostgreSQL с помощью Libpq подтверждено), теперь я вижу, что эмулятор нуждается32-битная сборка.Итак, последняя часть: как мне установить конфигурацию ?

В библиотеке есть стандартный скрипт configure, насколько я знаю, но я все еще довольно нов в этом.

Отредактировано, чтобы добавить:

Я дошел до этого далеко, но ссылки на i686 явно неверны.

Я не знаюесли i386 считается кросс-компиляцией, если мне нужны опции "host" и "target" тоже.

ICU_PATH=/Users/eric.grunin/Documents/dev/icu2

DEVROOT=/Developer/Platforms/iPhoneSimulator.platform/Developer
SDKROOT=$DEVROOT/SDKs/iPhoneSimulator4.3.sdk
SYSROOT=$SDKROOT

ICU_FLAGS="-I$ICU_PATH/source/common/ -I$ICU_PATH/source/tools/tzcode/ "

export CXXPP=
export CXXPPFLAGS=
export CPPFLAGS="-I$SDKROOT/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/include/ -I$SDKROOT/usr/include/c++/4.2.1/armv7-apple-darwin10/ -I./include/ -miphoneos-version-min=2.2 $ICU_FLAGS"

export CFLAGS="$CPPFLAGS -pipe -no-cpp-precomp -isysroot $SDKROOT"
export CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS"
export CXXFLAGS="$CFLAGS" 

export CC="$DEVROOT/usr/llvm-gcc-4.2/bin/i686-apple-darwin10-llvm-gcc-4.2"
export CXX="$DEVROOT/usr/llvm-gcc-4.2/bin/i686-apple-darwin10-llvm-g++-4.2"
export LDFLAGS="-L$SDKROOT/usr/lib/ -isysroot $SDKROOT -Wl,-dead_strip -miphoneos-version-min=2.0"

cd $ICU_PATH
mkdir simbuild
cd simbuild

$ICU_PATH/source/configure --enable-static --disable-shared 
gnumake

Ответы [ 3 ]

4 голосов
/ 10 января 2012

Вам необходимо создать толстую библиотеку: толстая библиотека - это библиотека, которая встраивает код многих архитектур в один файл.
Для устройств необходимо добавить архитектуры armv6 и armv7.Для симулятора i386.

Посмотрите на этот ответ для деталей и сценария, как сделать это из Xcode: https://stackoverflow.com/a/3647187/272342

1 голос
/ 11 января 2012

Это просто библиотека данных. Вам не нужно строить его несколько раз. Используйте --with-data-packaging=archive при создании ICU, а затем он сгенерирует файл icudt*.dat .. при запуске приложения, позвоните u_setDataDirectory(), чтобы сообщить ему, в каком каталоге содержится этот файл .dat. u_setDataDirectory ()

1 голос
/ 11 января 2012

Вот как я заставил это работать. Я помещаю это здесь, чтобы я мог посмотреть это позже.

Вероятно, это несовершенно, не стесняйтесь исправлять это. Комментарии пытаются отделить то, что является общим от того, что является специфическим для библиотеки ICU, которую я строил.

// This is is required by the ICU configure step

# must be ABSOLUTE PATH
ICU_PATH=/Users/eric.grunin/Documents/dev/icu2

// First crucial bit: specify the Simulator

DEVROOT=/Developer/Platforms/iPhoneSimulator.platform/Developer
SDKROOT=$DEVROOT/SDKs/iPhoneSimulator4.3.sdk
SYSROOT=$SDKROOT

// for convenience

ICU_FLAGS="-I$ICU_PATH/source/common/ -I$ICU_PATH/source/tools/tzcode/ "

export CXXPP=
export CXXPPFLAGS=

// current version of gcc is missing some #include files, we have to get them elsewhere

export CPPFLAGS="-I$SDKROOT/usr/include/c++/4.2.1/i686-apple-darwin10/ -I$SDKROOT/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/include/ -I$SDKROOT/usr/include/c++/4.2.1/armv7-apple-darwin10/ -I./include/ -miphoneos-version-min=2.2 $ICU_FLAGS"

// MUST specify -arch i386

export CFLAGS="$CPPFLAGS -pipe -arch i386 -no-cpp-precomp -isysroot $SDKROOT"
export CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS"
export CXXFLAGS="$CFLAGS" 

export CC="$DEVROOT/usr/bin/gcc"
export CXX="$DEVROOT/usr/bin/g++"

// MUST add -arch i386 here.
// Also: to avoid "undefined symbol: _Unwind_Resume", add -lgcc_eh

export LDFLAGS="-arch i386 -L$SDKROOT/usr/lib/ -lgcc_eh -isysroot $SDKROOT -Wl,-dead_strip -miphoneos-version-min=2.0"

cd $ICU_PATH
mkdir simbuild
cd simbuild

// Not sure if --host is really needed

$ICU_PATH/source/configure --enable-static --disable-shared --host=i686-apple-darwin10
gnumake

Я, вероятно, не собираюсь делать толстый двоичный файл, потому что библиотека ICU уже очень большая, и мне нужно, чтобы конечное приложение было как можно меньше.

Отредактировано для добавления

Я попробовал подход с толстой библиотекой: он утроился размер моего приложения, увы.

...