Кръстосано компилиране на 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 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.

И цялата помощ е много ценена!


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 I Buzzed First (налично на 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