交叉编译ZeroMQ到ARM以用于MonoTouch iPhone应用程序配置设置

交叉编译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

我正试图在一款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/libzmq.dylib
。ZeroMq C#binding
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)]
并将
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
,以进行构建