我如何为armv6,armv7和i386编译静态库(fat)

Mas*_*aro 16 iphone xcode static-libraries fat-binaries universal-binary

我知道这个问题已多次提出,但我的目标与我在网上搜索的内容略有不同.具体来说,我已经能够为iPhone构建一个静态库,但我能够构建的最终胖文件只包含arm和i386架构(我不确定arm指的是:是v6还是v7?).我无法专门为armv6和armv7编译,他们使用lipo合并两个架构.lipo工具抱怨armv6和armv7库中存在相同的架构(arm,而不是armv6或armv7).

有人可以解释如何构建armv6和armv7,他们使用lipo将这些库合并为一个胖文件?

编辑:我需要构建不使用Xcode,而是直接编译传统的unix库.

Yan*_*ang 11

这是我发现的一个很好的解决方案:支持iOS 5和Arm64的静态Libs

编辑:

解决方案是构建不同的体系结构,然后使用lipo使用命令行(或Rakefile)绑定它们.

首先使用xcodebuild使用arm构建二进制文件:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='armv7 armv7s' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-arm' BUILT_PRODUCTS_DIR='./build-arm'
Run Code Online (Sandbox Code Playgroud)

请注意,您必须设置IPHONEOS_DEPLOYMENT_TARGET ='5.0'和ARCHS ='armv7 armv7s',建议设置构建和产品目录以使事情更加清晰,请查看构建设置参考以获取此标志的含义.

arm64的下一个版本:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-arm64' BUILT_PRODUCTS_DIR='./build-arm64'
Run Code Online (Sandbox Code Playgroud)

请注意ARCHS和IPHONEOS_DEPLOYMENT_TARGET的区别.我们还需要构建模拟器,在这种情况下,我们必须将sdk更改为iphonesimulator7.0并首先为i386构建两个步骤:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-i386' BUILT_PRODUCTS_DIR='./build-i386'
Run Code Online (Sandbox Code Playgroud)

现在是棘手的部分!如果您只是根据Xcode设置将ARCHS更改为x86_86,则会出现如下错误:"x86_64不是有效的拱形".要避免这种情况,只需添加VALID_ARCHS ='x86_64':

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-x86_64' BUILT_PRODUCTS_DIR='./build-x86_64'
Run Code Online (Sandbox Code Playgroud)

最后,我们只需要创建一个包含所有5种体系结构的胖二进制文件:

lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a'
Run Code Online (Sandbox Code Playgroud)

作者创建了一个这样的工作示例,你可以得到它:https://github.com/diogot/StaticLibDemo


以下是帖子的链接:支持iOS 5和Arm64的静态Libs

所有学分都归Diogo Tridapalli所有.


jam*_*mie 7

只需使用libtool将两个arm6和arm7版本链接在一起 - 这就是XCode的功能.但是,如果您尝试将这些静态库组合到新的超级库中,则会遇到问题.如果您需要这样做,请阅读此内容.

如果你已经这样做了,那就是为什么lipo抱怨你的"armv6"库同时包含armv6和armv7.我的帖子有一个修复程序可能会更容易,因为你不使用XCode,但基本上你使用lipo -extract确保你有一个瘦armv6库和瘦armv7库,然后再继续.