【问题标题】:How do i compile a static library (fat) for armv6, armv7 and i386我如何为 armv6、armv7 和 i386 编译静态库(fat)
【发布时间】:2011-02-17 02:45:07
【问题描述】:

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

有人可以准确解释如何为 armv6 和 armv7 构建,然后他们使用 lipo 将这些库合并到一个 fat 文件中吗?

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

【问题讨论】:

    标签: iphone xcode static-libraries universal-binary fat-binaries


    【解决方案1】:

    这是我找到的一个很好的解决方案:Static Libs With Support to iOS 5 and Arm64

    已编辑:

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

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

    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'
    

    请注意,您必须设置 IPHONEOS_DEPLOYMENT_TARGET='5.0' 和 ARCHS='armv7 armv7s',建议设置 build 和 product dirs 以使事情更清楚,请查看 Build Setting Reference 了解更多详细信息此标志的含义.

    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'
    

    注意 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'
    

    现在是棘手的部分!如果您只是根据您的 Xcode 设置将 ARCHS 更改为 x86_86,您将收到如下错误:“x86_64 is not a valid arch”。为避免这种情况,只需添加 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'
    

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

    lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a'
    

    作者为此创建了一个工作示例,您可以获取它:https://github.com/diogot/StaticLibDemo


    这是帖子的链接:Static Libs With Support to iOS 5 and Arm64

    所有功劳归于 Diogo Tridapalli。

    【讨论】:

    • 谢谢你告诉我! @kleopatra
    【解决方案2】:

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

    如果您已经这样做了,那就是 lipo 抱怨您的“armv6”库同时包含 armv6 和 armv7 的原因。由于您不使用 XCode,因此我的帖子有一个可能对您来说更容易的修复程序,但基本上您使用 lipo -extract 来确保您有一个瘦 armv6 库和一个瘦 armv7 库,然后再继续。

    【讨论】:

      【解决方案3】:

      在重新加入之前似乎不需要从 fat 库中提取(如 jamie 的回答中所述)。我正在使用来自苹果的最终 4.0 SDK,它似乎默认创建了胖 armv6/armv7 库。

      我之前是这样指定输入库的架构的:

      $DEVROOT/usr/bin/lipo -arch arm $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a
      

      这在后来的 SDK 上失败了,但是从(现在很胖的)arm lib 中删除架构可以正常工作:

      $DEVROOT/usr/bin/lipo $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a
      

      Lipo 现在必须能够检测胖库中的架构。

      【讨论】:

        【解决方案4】:

        确保将您的构建设置设置为Valid Architectures: armv6 armv7Architectures: Optimized (armv6 armv7)。这应该会导致针对 v6 和 v7 优化的二进制文件。如果您不确定它是否成功,只需设置Architectures: Standard (armv6) 并比较文件大小。优化后应该会产生两倍的大小(当我没记错的时候)。

        您也可以随时在二进制文件中使用lipo -info 来查看所有包含的架构。

        在我的应用程序的分发版本上运行它会给我:

        ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My
        Architectures in the fat file: My are: armv6 armv7 
        

        【讨论】:

        • 对不起,我忘了说我需要构建它而不是使用 Xcode,而是直接编译一个传统的 unix 库。我正在编辑我的答案以反映这一事实。
        猜你喜欢
        • 2012-01-23
        • 2023-04-01
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 2012-03-24
        • 2012-01-15
        • 1970-01-01
        相关资源
        最近更新 更多