我试图在使用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
Run Code Online (Sandbox Code Playgroud)
我的简单C#ZeroMq应用程序然后正常工作.
接下来,我尝试在iPhone模拟器中的iPhone应用程序中使用ZeroMq.我发现iPhone只允许静态链接库(不允许使用动态库).这是通过将所有C#包装器调用更改为来实现的
[DllImport("__Internal", CallingConvention = CallingConvention.Cdecl)]
Run Code Online (Sandbox Code Playgroud)
并libzmq.a直接包含在MonoTouch项目中,并设置额外的mtouch参数
-cxx -gcc_flags "-L${ProjectDir} -lzmq -force_load ${ProjectDir}/libzmq.a"
Run Code Online (Sandbox Code Playgroud)
确保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
Run Code Online (Sandbox Code Playgroud)
在iPhone模拟器中取得成功!模拟器需要为iPhone模拟器SDK构建的i386静态库.我现在可以在模拟器中的iPhone应用程序中使用ZeroMQ功能.然而它在真正的iPhone上不起作用.
这是因为真正的iPhone需要一个为ARM架构而构建的库,以及真正的iPhoneOS SDK.
(构建3个独立的库 - i386,ARM6和ARM7,并将所有3个库组合成可以在任何环境中使用的'fat'库存在一个侧面问题.在我到达之前,我需要能够为ARM构建这个问题).
**最后,我的问题!!** …