Кросс-компиляция ZeroMQ на ARM для использования в MonoTouch iPhone app configure settings

Я пытаюсь использовать библиотеку ZeroMQ в приложении для iPhone, разработанном на C# с использованием MonoTouch. Я решил почти все проблемы, но упал на последнем препятствии. Я использую ZeroMQ 2.1.10, привязку/обертку C# CLR и разрабатываю в Mac OS X 10.6.8. Вот история на данный момент:

Сначала я попытался использовать ZeroMq в простом консольном приложении Mono C# Console. Я собрал ZeroMQ с помощью ./configure, затем make и sudo make install, который установил разделяемую библиотеку /usr/local/lib/libzmq.dylib. ZeroMq C# binding clrzmq.dll - это обертка, которая использует "основную" функциональность ZeroMq через вызовы C Api [DllImport].

Тестовое приложение не работало, что, как я выяснил, связано с тем, что стандартный ZeroMQ ./configure выдает 64-битный результат, а Mono только 32-битный. Затем я перестроил ZeroMQ с

./configure CFLAGS="-O -arch i386" CXXFLAGS="-O -arch i386" LDFLAGS="-arch i386" --disable-dependency-tracking

Мое простое приложение ZeroMq на C# заработало корректно.

Двигаясь дальше, я попытался использовать ZeroMq внутри приложения iPhone в симуляторе iPhone. Я обнаружил, что iPhone позволяет использовать только статически связанные библиотеки (динамические библиотеки не допускаются). Это было достигнуто путем изменения всех вызовов обертки C# на

[DllImport("__Internal", CallingConvention = CallingConvention.Cdecl)]

и включения libzmq.a непосредственно в проект MonoTouch, а также установки дополнительных аргументов mtouch

-cxx -gcc_flags "-L${ProjectDir} -lzmq -force_load ${ProjectDir}/libzmq.a"

для обеспечения включения библиотеки ZeroMQ в приложение iPhone.

При запуске приложения в симуляторе iPhone произошел сбой, который я отследил до вызова, сделанного из zmq_init() в socketpair. В конце концов я обнаружил, что библиотека ZeroMQ была собрана на основе заголовков и библиотек MacOS моей машины сборки, а не на основе iPhone SDK. Это было исправлено с помощью

./configure CFLAGS="-O -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk" CXXFLAGS="-O -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk" LDFLAGS="-arch i386" --disable-dependency-tracking

Успех в симуляторе iPhone! Для симулятора требуются статические библиотеки i386, собранные на основе SDK симулятора iPhone. Теперь я могу использовать функциональность ZeroMQ в приложении iPhone ТОЛЬКО в симуляторе. Однако это не работает на реальном iPhone.

Это происходит потому, что для реального iPhone требуется библиотека, созданная для архитектуры ARM и для SDK реального iPhoneOS.

(Существует побочная проблема создания 3 отдельных библиотек - i386, ARM6 и ARM7, и объединения всех трех в "толстую" библиотеку, которая может быть использована в любой среде. Мне нужно уметь собирать для ARM, прежде чем я займусь этой проблемой).

** Наконец-то, мой вопрос!!! **

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

Ближе всего к работе я подошел так:

./configure CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2
CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld CFLAGS="-O -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk"
CXXFLAGS="-O -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk"
--disable-dependency-tracking --host=arm-apple-darwin10
LDFLAGS="-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" 
AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar 
AS=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/as 
LIBTOOL=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/libtool 
STRIP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/strip 
RANLIB=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib

Получается конфиг, который make компилирует код ZeroMq, но не работает с большим количеством ошибок соединения, например:

ar: libzmq_la-clock.o: No such file or directory

Я пробовал много других конфигураций, но они даже не проходят ./configure правильно.

Может ли кто-нибудь помочь мне с подходящим списком параметров ./configure для создания статической библиотеки для архитектуры ARM? Это все, что мне нужно, чтобы заставить ZeroMQ работать на настоящем iPhone.

И вся помощь будет очень признательна!

5
задан Eimantas 3 February 2012 в 11:15
поделиться