Кросс-компиляция ZeroMQ в ARM для использования в приложении MonoTouch для iPhone, настройка параметров

Я пытаюсь использовать библиотеку 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 # 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

Мое простое приложение C # ZeroMq тогда работало правильно.

Двигаясь дальше, я затем попытался использовать 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.

(Существует побочная проблема создания трех отдельных библиотек - 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.

И вся помощь очень ценится!


person yorkshirespud    schedule 29.11.2011    source источник
comment
Я уже просматривал страницу Compile C lib для iPhone, но в этом посте сценарий настройки оригинального постера не работает для него или меня, и этот пост заканчивается словами «Я исправил это с помощью этого поста» и некоторыми неработающими ссылки. Я все еще не могу получить кросс-компиляцию для ARM или ZeroMQ, работающего на данный момент. Я буду стараться!   -  person yorkshirespud    schedule 30.11.2011


Ответы (2)


Просто подумал, что поделюсь тем, что в конце концов нашел ответ - уловка заключалась в том, чтобы добавить CPP="cpp" CXXCPP="cpp" к выражению ./configure, давая:

./configure CPP="cpp" CXXCPP="cpp" 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

Я использовал эту конфигурацию для успешной сборки ZeroMQ для ARM, как и в моем новом приложении для iPhone, которое я сначала посетил (доступно по адресу http://itunes.apple.com/gb/app/i-buzzed-first!/id490622820?mt=8)

person yorkshirespud    schedule 22.12.2011
comment
К вышесказанному следует добавить еще один момент. Тестирование показало, что приведенная выше сборка создала библиотеку, которая нормально работала в iOS 4 и 5, но вылетала на iOS3. См. ссылку для дополнительная информация, но краткая версия заключается в том, что при сборке с использованием iOS5 SDK и g ++ 4.2 или выше компилятор использует операции, не поддерживаемые в iOS3. Решение состоит в том, чтобы изменить /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/c++/4.2.1/bits/c++config.h и удалить #define _GLIBCXX_ATOMIC_BUILTINS 1, чтобы построить - person yorkshirespud; 15.01.2012

Этот вопрос на самом деле не относится к MonoTouch, а к тому, как скомпилировать 0MQ на iOS (ARM). Взгляните на: Скомпилировать C lib для iPhone

Надеюсь, это поможет вам, а также ответит на следующий вопрос: толстые универсальные двоичные файлы с использованием lipo. Хорошая новость заключается в том, что, если это работает на симуляторе, вы, вероятно, уже рассмотрели любую проблему, связанную с MonoTouch :-)

person poupou    schedule 30.11.2011