编译ios框架时,我正在关注opencv安装文档Installation in iOS。但是,如果我没有更改platform/ios/build_framework.py
并构建框架,我将遇到以下错误:
build settings from command line:
ARCHS = x86_64
IPHONEOS_DEPLOYMENT_TARGET = 6.0
SDKROOT = iphonesimulator6.1
Build Preparation
Build task concurrency set to 8 via user default IDEBuildOperationMaxNumberOfConcurrentCompileTasks
=== BUILD AGGREGATE TARGET ZERO_CHECK OF PROJECT OpenCV WITH CONFIGURATION Release ===
Check dependencies
=== BUILD NATIVE TARGET zlib OF PROJECT OpenCV WITH CONFIGURATION Release ===
=== BUILD NATIVE TARGET libjpeg OF PROJECT OpenCV WITH CONFIGURATION Release ===
** BUILD FAILED **
Build settings from command line:
ARCHS = x86_64
IPHONEOS_DEPLOYMENT_TARGET = 6.0
SDKROOT = iphonesimulator6.1
=== BUILD NATIVE TARGET zlib OF PROJECT OpenCV WITH CONFIGURATION Release ===
Check dependencies
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
** BUILD FAILED **
然后,经过多次尝试,我发现如果我只通过更改platform/ios/build_framework.py
中的以下脚本来编译架构armv7,armv7s和i386,则可以成功构建框架。
targets = ["iPhoneOS", "iPhoneOS", "iPhoneSimulator"] #"iPhoneOS", "iPhoneSimulator"
archs = ["armv7", "armv7s", "i386"]#"arm64", , "x86_64"
for i in range(len(targets)):
build_opencv(srcroot, os.path.join(dstroot, "build"), targets[i], archs[i])
关于如何编译arm64和x86_64架构的任何想法?谢谢。
答案 0 :(得分:2)
取出i386并编译armv7,armv7s和arm64--这些是Xcode for 64位的架构选项 - iphone5s。
不要混合他们不会和不能混合的英特尔和手臂规格。架构命令用于通知编译器如何创建目标代码。因为intel是CISC处理器而arm是RISC内部,它们的目标代码是非常不同的。 例如,MOVE命令可以为英特尔生成x'80'代码(命令指令),但为ARM生成x'60'。据我所知,i386是旧的英特尔32位架构,Xcode可能会有一些神奇的功能,可以在intel和RISC上运行通用目标代码 - 如果这样做的话 - 效率不高,它总是会更好编译到特定的体系结构。
32位,64位128 .....是寻址模式 - 它们也是处理器寄存器的大小,并决定CPU可以访问多少内存(RAM)。通常,除了具有巨大RAM的能力之外,更高位处理器通常会减少执行特定任务的指令数量。
由于通常内置向下兼容性,因此为armv6编译的应用程序通常在兼容模式下以armv7甚至arm64运行,但它无法利用运行真正的64位应用程序的优势。
目标是更高级别的规范,它指定可以使用哪些命令,例如iPad具有UIPopViewController,但iPhone或iPod touch不支持此功能。
最后一件事 - 只有iPhone 5s可以与arm64配合使用,如果你设置了另一个目标,它可能会将arm64标记为不是一个选项。
答案 1 :(得分:0)
因此,如果您正在为x86_64架构进行编译,那就是OS X(笔记本电脑或Mac塔),而不是iOS(iPad,iPhone)。
你在用什么?我认为不是Xcode吗?
除非您希望在64位Mac笔记本电脑或台式机上运行,否则无需编译到x86_64。看起来好像你试图用你的问题做到这一点?
另外,如果你有它用于i386,它可能与大多数OS X机器兼容 - 它只能运行32位而不是64位。
就arm64而言,这也可能是64位。你可能没有64位的库?你的机器是64位运行的吗?检查opencv库(动态或静态?)&看看他们是32还是64?如果它们是32位那么那就是问题所在。您需要将它们构建为64位库或查找它们。不知道你在哪个平台上,我不能再给你信息了。
答案 2 :(得分:0)