【发布时间】:2012-02-03 19:15:22
【问题描述】:
我正在尝试在使用 MonoTouch 以 C# 开发的 iPhone 应用程序中使用 ZeroMQ 库。我已经解决了几乎所有的问题,但在最后一道关卡中倒下了。我正在使用 ZeroMQ 2.1.10 和 C# CLR 绑定/包装器,并在 Mac OS X 10.6.8 中进行开发。这是迄今为止的故事:
我首先尝试在一个简单的 Mono C# 控制台应用程序中使用 ZeroMq。我用./configure、make 和sudo make install 构建了ZeroMQ,它安装了共享库/usr/local/lib/libzmq.dylib。 ZeroMq C# 绑定 clrzmq.dll 是一个包装器,它通过 C Api [DllImport] 调用使用“核心”ZeroMq 功能。
测试应用程序不起作用,我发现标准 ZeroMQ ./configure 产生 64 位输出,而 Mono 只有 32 位。然后我用
./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)]
并在 MonoTouch 项目中直接包含 libzmq.a,并设置额外的 mtouch 参数
-cxx -gcc_flags "-L${ProjectDir} -lzmq -force_load ${ProjectDir}/libzmq.a"
确保 ZeroMQ 库包含在 iPhone 应用程序中。
在 iPhone 模拟器中运行该应用程序时,它崩溃了,我追踪到从 zmq_init() 到 socketpair 的调用。我最终将其追溯到针对我的构建机器的 MacOS 头文件和库构建的 ZeroMQ 库,而不是针对 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 上运行所需的全部内容。
非常感谢所有帮助!
【问题讨论】:
-
我已经查看了 Compile C lib for iPhone 页面,但是在那篇文章中,原始发帖人的配置脚本对他或我都不起作用,并且那篇文章以“我修复了它这篇文章的帮助和一些断开的链接。目前我仍然无法对 ZeroMQ 的 ARM 进行交叉编译。我会继续努力的!
标签: iphone ios xamarin.ios arm zeromq