Кросс-компиляция ZeroMQ в ARM для использования в приложении MonoTouch для iPhone. Настройка параметров - PullRequest
5 голосов
/ 30 ноября 2011

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

Сначала я попытался использовать ZeroMq в простом консольном приложении Mono C #.Я построил 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 Simulator!Для симулятора требуются статические библиотеки i386, встроенные в SDK симулятора iPhone.Теперь я могу использовать функциональность ZeroMQ только в приложении для iPhone в симуляторе.Однако он не работает на реальном iPhone.

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

(Существуетпобочный вопрос создания 3 отдельных библиотек - i386, ARM6 и ARM7 и объединения всех 3 в «толстую» библиотеку, которую можно использовать в любой среде. Мне нужно иметь возможность собрать для 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.

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

Ответы [ 2 ]

5 голосов
/ 22 декабря 2011

Просто подумал, что поделюсь, что нашел ответ в конце - хитрость заключалась в том, чтобы добавить 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)

2 голосов
/ 30 ноября 2011

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

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

...