交叉编译ZeroMQ到ARM以用于MonoTouch iPhone应用程序配置设置
我正试图在一款iPhone应用程序中使用ZeroMQ库,该应用程序是使用MonoTouch在C#中开发的。我已经解决了几乎所有的问题,但在最后一个关卡上失败了。我正在使用ZeroMQ 2.1.10和C#CLR绑定/包装器,并在Mac OS X 10.6.8中开发。以下是迄今为止的故事: 我第一次尝试在一个简单的Mono C#控制台应用程序中使用ZeroMq。我使用交叉编译ZeroMQ到ARM以用于MonoTouch iPhone应用程序配置设置,iphone,ios,xamarin.ios,arm,zeromq,Iphone,Ios,Xamarin.ios,Arm,Zeromq,我正试图在一款iPhone应用程序中使用ZeroMQ库,该应用程序是使用MonoTouch在C#中开发的。我已经解决了几乎所有的问题,但在最后一个关卡上失败了。我正在使用ZeroMQ 2.1.10和C#CLR绑定/包装器,并在Mac OS X 10.6.8中开发。以下是迄今为止的故事: 我第一次尝试在一个简单的Mono C#控制台应用程序中使用ZeroMq。我使用/configure构建了ZeroMQ,然后使用make和sudo make install安装共享库/usr/local/lib/l
/configure
构建了ZeroMQ,然后使用make
和sudo make install
安装共享库/usr/local/lib/libzmq.dylib
。ZeroMq C#bindingclrzmq.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)]
并将libzmq.a
直接包含在MonoTouch项目中,并设置额外的mtouch参数
-cxx -gcc_flags "-L${ProjectDir} -lzmq -force_load ${ProjectDir}/libzmq.a"
确保iPhone应用程序中包含ZeroMQ库
在iPhone模拟器中运行应用程序时,它崩溃了,我追踪到一个从zmq_init()
到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架构构建的库,并与真正的iphoneosdk相对应
(有一个附带问题是构建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
有人能帮我提供一个合适的/配置参数列表来生成ARM体系结构静态库吗?这就是让ZeroMQ在真正的iPhone上工作所需要的一切
非常感谢大家的帮助 这个问题实际上与MonoTouch无关,而是关于如何在iOS(ARM)上编译0MQ。看看:
希望它能对您有所帮助,并涵盖下一个问题:使用lipo
的fat通用二进制文件。好消息是,如果这在模拟器上起作用,那么您可能已经讨论了任何与MonoTouch相关的问题:-)我想分享一下,我最终找到了答案-诀窍是将CPP=“CPP”cxcpp=“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应用程序中使用的一样,我首先蜂鸣器(可在上找到)我已经查看了针对iPhone的编译C库页面,但在那篇文章中,原始海报的配置脚本对他或我都不起作用,这篇文章以“我在这篇文章的帮助下修复了它”和一些断开的链接结束。目前,我仍然无法对ZeroMQ的ARM进行交叉编译。我会继续努力!以上还有一点需要补充。测试显示,上述构建生成的库在iOS 4和5中运行良好,但在iOS 3上崩溃。有关更多信息,请参阅,但简短的版本是,当使用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\u GLIBCXX\u ATOMIC\u BUILTINS 1
,以进行构建