iOS armv7, armv7s, arm64区别与应用32位、64位配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS armv7, armv7s, arm64区别与应用32位、64位配置相关的知识,希望对你有一定的参考价值。

参考技术A 如果你不能确定库是否支持了arm64,可以在cmd模式下用file命令来检查一下库文件:

armv7,armv7s和arm64,i386,x86_64这些都代表什么?

__Arm处理器,因为其低功耗和小尺寸而闻名,几乎所有的手机处理器都基于arm,其在嵌入式系统中的应用非常广泛,它的性能在同等功耗产品中也很出色。

Armv6、armv7、armv7s、arm64都是arm处理器的指令集,所有指令集原则上都是向下兼容的,如iPhone4S的CPU默认指令集为armv7指令集,但它同时也兼容armv6指令集,只是使用armv6指令集时无法充分发挥其性能,即无法使用armv7指令集中的新特性,同理,iPhone5的处理器标配armv7s指令集,同时也支持armv7指令集,只是无法进行相关的性能优化,从而导致程序的执行效率没那么高。

现在回归到正题,如何制作一个“没有问题”的.a静态库,通过以上信息了解到,当我们做App的时候,为了追求高效率,并且减小包的大小,Build Active Architecture Only设置成YES,Architectures按Xcode默认配置就可以,因为arm64向前兼容。但制作.a静态库就不同了,因为要保证兼容性,包括不同ios设备以及模拟器运行不出错,所以结合当前行业情况,要做到最大的兼容性。
ValidArchitectures设置为:armv7|armv7s|arm64|i386|x86_64
Architectures设置不变(或根据你需要): armv7|arm64
然后分别选择iOS设备和模拟器进行编译,最后找到相关的.a进行合包:

使用lipo -create 真机库.a的路径 模拟器库.a的的路径 -output 合成库的名字.a ,这样就制作了一个通用的静态库.a。
制作动态、静态库详情可以参考 【链接】

部份资源 链接

适用于 iOS 的 leptonica 1.69 交叉编译(armv7、armv7s 和 arm64)

【中文标题】适用于 iOS 的 leptonica 1.69 交叉编译(armv7、armv7s 和 arm64)【英文标题】:leptonica 1.69 crosscompile for iOS (armv7, armv7s and arm64) 【发布时间】:2014-06-12 10:59:08 【问题描述】:

我尝试为 armv7、armv7s 和 arm64 交叉编译 leptonica 1.69。

对于模拟器(i386、x86_64),我使用这些设置并且效果很好:

export IOS_BASE_SDK="7.1"
export IOS_DEPLOY_TGT="6.1"
export TOOLCHAIN=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain 
export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer

export SDKROOT=$DEVROOT/SDKs/iPhoneSimulator$IOS_BASE_SDK.sdk
export CFLAGS="-arch x86_64 -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT -I$SDKROOT/usr/include/"

export CPP=$TOOLCHAIN/usr/bin/cpp
export CXX=$TOOLCHAIN/usr/bin/c++
export CXXCPP=$TOOLCHAIN/usr/bin/cpp
export CC=$TOOLCHAIN/usr/bin/cc
export LD=$TOOLCHAIN/usr/bin/ld
export AR=$TOOLCHAIN/usr/bin/ar
export AS=$TOOLCHAIN/usr/bin/as
export NM=$TOOLCHAIN/usr/bin/nm
export RANLIB=$TOOLCHAIN/usr/bin/ranlib
export LDFLAGS="-L$SDKROOT/usr/lib/"

export CPPFLAGS="-no-cpp-precomp -I$SDKROOT/usr/include/"
export CXXFLAGS=$CFLAGS

然后调用configure

./configure --enable-shared=no --disable-programs --without-zlib --without-libpng --without-jpeg --without-giflib --without-libtiff --libdir=$PWD/lib/nodebug

现在要为 arm 构建它,我尝试使用以下设置:(将 -arch 添加到 CFLAGS 和 CPPFLAGS,设置 SDK 根目录并添加 --host=x86_64)

export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
export SDKROOT=$DEVROOT/SDKs/iPhoneOS$IOS_BASE_SDK.sdk
export CFLAGS="-arch armv7 -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT -I$SDKROOT/usr/include/"
export CPPFLAGS="-arch armv7 -no-cpp-precomp -I$SDKROOT/usr/include/"

./configure --host=x86_64 --enable-shared=no --disable-programs --without-zlib --without-libpng --without-jpeg --without-giflib --without-libtiff --libdir=$PWD/lib/nodebug

但不知何故,cpp 不起作用。配置日志显示以下内容:

configure:5841: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp -arch armv7 -no-cpp-precomp -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/include/ conftest.c
clang: error: no input files

任何人有什么想法有什么问题吗?或者知道如何进一步调试?

【问题讨论】:

【参考方案1】:

我的编译器、预处理器等路径似乎有问题。仅使用路径中的默认路径即可。所以删除以下部分解决了我的问题:

export CPP=$TOOLCHAIN/usr/bin/cpp
export CXX=$TOOLCHAIN/usr/bin/c++
export CXXCPP=$TOOLCHAIN/usr/bin/cpp
export CC=$TOOLCHAIN/usr/bin/cc
export LD=$TOOLCHAIN/usr/bin/ld
export AR=$TOOLCHAIN/usr/bin/ar
export AS=$TOOLCHAIN/usr/bin/as
export NM=$TOOLCHAIN/usr/bin/nm
export RANLIB=$TOOLCHAIN/usr/bin/ranlib
export LDFLAGS="-L$SDKROOT/usr/lib/"

【讨论】:

如果您能够为 arm64 构建它,您可以在某处共享二进制文件吗?

以上是关于iOS armv7, armv7s, arm64区别与应用32位、64位配置的主要内容,如果未能解决你的问题,请参考以下文章

为 armv7、armv7s、arm64、i386 和通用构建 ffmpeg iOS 库

适用于 iOS 的 leptonica 1.69 交叉编译(armv7、armv7s 和 arm64)

arm64 armv7 armv7s 架构设置

Worklight 6.0.0.1 iOS 本机库仅适用于 ARMv7 而不适用于 ARMv7s 和 ARM64?

iOS 指令集arm64、armv7s、armv7、i386、x86_64

iOS CPU架构 arm64/armv7s/armv7/armv7k/i386/x86_64