我正在尝试在使用 MonoTouch 用 C# 开发的 iPhone 应用程序中使用 ZeroMQ 库。我几乎解决了所有的问题,却在最后一道坎倒下了。我正在使用 ZeroMQ 2.1.10 和 C# CLR 绑定/包装器,并在 Mac OS X 10.6.8 中进行开发。到目前为止的故事是这样的:
我首先尝试在简单的 Mono C# 控制台应用程序中使用 ZeroMq。我用它构建了 ZeroMQ./configure
, then make
and sudo make install
,安装共享库/usr/local/lib/libzmq.dylib
。 ZeroMq C# 绑定clrzmq.dll
是一个通过 C Api 使用“核心”ZeroMq 功能的包装器[DllImport]
calls.
测试应用程序不起作用,我发现这是标准的 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"
确保 iPhone 应用程序中包含 ZeroMQ 库。
当在 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 个库组合成可在任何环境中使用的“胖”库。在开始之前,我需要能够为 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 上运行所需的全部内容。
非常感谢所有帮助!