yor*_*pud 5 iphone arm zeromq xamarin.ios ios
我试图在使用MonoTouch的C#开发的iPhone应用程序中使用ZeroMQ库.我已经解决了几乎所有的问题,但是在最后一道障碍中倒下了.我正在使用ZeroMQ 2.1.10和C#CLR绑定/包装器,并在Mac OS X 10.6.8中进行开发.这是迄今为止的故事:
我首先尝试在简单的Mono C#Console应用程序中使用ZeroMq.我内置ZeroMQ用./configure,然后make和sudo make install,它安装共享库/usr/local/lib/libzmq.dylib.ZeroMq C#绑定clrzmq.dll是一个包装器,它通过C Api [DllImport]调用使用'核心'ZeroMq功能.
测试应用程序不起作用,我发现标准ZeroMQ ./configure产生64位输出,而Mono只有32位.然后我重建了ZeroMQ
./configure CFLAGS="-O -arch i386" CXXFLAGS="-O -arch i386" LDFLAGS="-arch i386" --disable-dependency-tracking
我的简单C#ZeroMq应用程序然后正常工作.
接下来,我尝试在iPhone模拟器中的iPhone应用程序中使用ZeroMq.我发现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()to 的调用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模拟器中取得成功!模拟器需要为iPhone模拟器SDK构建的i386静态库.我现在可以在模拟器中的iPhone应用程序中使用ZeroMQ功能.然而它在真正的iPhone上不起作用.
这是因为真正的iPhone需要一个为ARM架构而构建的库,以及真正的iPhoneOS SDK.
(构建3个独立的库 - i386,ARM6和ARM7,并将所有3个库组合成可以在任何环境中使用的'fat'库存在一个侧面问题.在我到达之前,我需要能够为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上工作.
并且所有人都非常感谢!
只是想我分享我最终找到了答案 - 诀窍是添加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
我使用此配置成功构建了适用于ARM的ZeroMQ,这在我的新iPhone应用程序I Buzzed First中使用(可从http://itunes.apple.com/gb/app/i-buzzed-first!/id490622820?mt=8获取))