【问题标题】:Cross-compiling ZeroMQ to ARM for use in a MonoTouch iPhone app configure settings将 ZeroMQ 交叉编译到 ARM 以用于 MonoTouch iPhone 应用程序配置设置
【发布时间】: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。我用./configuremakesudo make install 构建了ZeroMQ,它安装了共享库/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)]

并在 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


【解决方案1】:

我只是想分享一下我最终找到了答案 - 诀窍是将 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 获得)

【讨论】:

  • 上面还有一点要补充。测试显示,上述构建生成的库在 iOS 4 和 5 中运行良好,但在 iOS3 中崩溃。有关更多信息,请参阅link,但简短的版本是在使用 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 以构建
【解决方案2】:

这个问题与 MonoTouch 无关,而是关于如何在 iOS (ARM) 上编译 0MQ。看看:Compile C lib for iPhone

希望它对您有所帮助并涵盖下一个问题:使用lipo 的胖通用二进制文件。好消息是,如果这适用于模拟器,那么您可能已经涵盖了任何与 MonoTouch 相关的问题 :-)

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多