Опитвам се да използвам библиотеката 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 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.
И цялата помощ е много ценена!