代码之家  ›  专栏  ›  技术社区  ›  Massimo Cafaro

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

  •  15
  • Massimo Cafaro  · 技术社区  · 14 年前

    我知道这个问题已经被提出了好几次,但是我的目标与我在搜索网页时发现的略有不同。具体来说,我已经能够为iPhone构建一个静态库,但是我能够构建的最终FAT文件只包含ARM和i386架构(我不确定ARM指的是什么:V6还是V7?).I无法专门为armv6和armv7编译,它们使用lipo合并了这两种架构。lipo工具抱怨在armv6和armv7库中存在相同的体系结构(arm,而不是armv6或armv7)。

    有人能准确地解释如何为armv6和armv7构建,并使用lipo将这些库合并到一个胖文件中吗?

    编辑 :我需要构建一个传统的Unix库,而不是使用Xcode。

    4 回复  |  直到 11 年前
        1
  •  7
  •   jamie    14 年前

    只需使用libtool将两个arm6和arm7版本链接在一起—Xcode就是这样做的。但是,如果您尝试将这些静态库合并到一个新的超级库中,就会出现问题。如果你需要那么读 this .

    如果你已经这样做了,这就是为什么Lipo抱怨你的“armv6”库同时包含armv6和armv7。我的文章有一个修复,可能会更容易,因为你不使用Xcode,但基本上你使用Lipo-Extract,以确保你有一个瘦的armv6库和一个瘦的armv7库,然后再进一步。

        2
  •  11
  •   Yang    11 年前

    我发现了一个很好的解决方案: Static Libs With Support to iOS 5 and Arm64

    编辑:

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

    首先使用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'
    

    请注意,您必须设置iphoneos的部署目标='5.0'和archs='armv7 armv7 s',建议您设置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'
    

    注意arch和iphoneos部署目标的区别。我们还需要为模拟器构建,在这种情况下,我们必须将sdk更改为iphone Simulator7.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设置将arch更改为x86_,则会出现如下错误:x86_不是有效的arch_。要避免这种情况,只需添加有效的“archs='x86_':

    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


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

    所有学分都归迪奥戈·特里达帕利所有。

        3
  •  2
  •   stigi    14 年前

    确保将生成设置设置为 Valid Architectures: armv6 armv7 Architectures: 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 
    
        4
  •  2
  •   gazreese    14 年前

    在重新加入之前,似乎不需要从脂肪库中提取(如Jamie的回答中所述)。我使用的是来自苹果的最后一个4.0sdk,它在默认情况下创建了fat 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上失败了,但是从(现在是fat)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现在必须能够检测FAT库中的体系结构。

    推荐文章