如何为i386和x86_64架构构建Cocoa Touch Framework?

在构建Cocoa Touch框架(Swift或Object-C)并将其作为“嵌入式二进制文件”添加到另一个项目后,当我尝试构建时,我收到以下错误消息

missing required architecture i386 ... ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

根据各种现有答案和扩展研究,我已经将i386添加到架构构建设置中……

在此处输入图像描述

然而,这似乎没有效果。 当我检查使用

 lipo -info TesterFrameworkObjC 

我得到了

 Architectures in the fat file: TesterFrameworkObjC are: armv7 arm64 

…不应该在i386(和x86_64)出现在这里吗? 我错过了什么?

(我正在使用Xcode 6.2 +构建iOS 8.2)


一些新的见解

使用此构建脚本的一个版本,我能够为Swift版本的框架构建缺少的体系结构。

在此处输入图像描述

但是,当我将此框架添加到我的应用程序并构建时,我仍然会收到错误

 Undefined symbols for architecture x86_64: "_OBJC_CLASS_$__TtC20TesterFrameworkSwift18TestFrameworkSwift", referenced from: objc-class-ref in ViewController.o ld: symbol(s) not found for architecture x86_64 

查看模拟器的最终构建文件夹构建

 Build/Products/Debug-iphoneos/TesterFrameworkSwift.framework/ 

我可以看到架构仍然缺失,尽管它们是框架的一部分(如图所示)。 在构建应用程序时,如何确保包含框架的所有正确架构构建?


更新

看看我的所有错误消息,看起来问题实际上并没有构建错误的产品/架构,但是一步之后, Linker没有使用正确的路径。 不确定这是多么正确。

这和我的问题一样。

似乎这是一个Xcode错误,我通过添加构建脚本来解决它。 它将只使用所有体系结构编译您的库,并将其转换为胖二进制图像。

另请注意

查看模拟器的最终构建文件夹构建

构建/产品/调试-的iPhoneOS / TesterFrameworkSwift.framework /

你正在iphone构建文件夹中查看x86_64和i386图像,它们应该在Debug-iphonesimulator/TesterFrameworkSwift.framework/

你的脚本中还有一个递归问题,我已经纠正过了。

 UNIVERSAL_OUTPUTFOLDER = $ {BUILD_DIR} / $ {}配置 - 通用

 if [“true”== $ {ALREADYINVOKED:-false}]
然后
回声“RECURSION:检测到,停止”
其他
 export ALREADYINVOKED =“true”

 #Step 1.构建设备和模拟器版本
 xcodebuild -target“$ {PROJECT_NAME}”ONLY_ACTIVE_ARCH = NO -configuration $ {CONFIGURATION} -sdk iphoneos BUILD_DIR =“$ {BUILD_DIR}”BUILD_ROOT =“$ {BUILD_ROOT}”clean build
 xcodebuild -target“$ {PROJECT_NAME}”-configuration $ {CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH = NO BUILD_DIR =“$ {BUILD_DIR}”BUILD_ROOT =“$ {BUILD_ROOT}”clean build

 #步骤2.将框架结构(从iphoneos build)复制到通用文件夹
 cp -R“$ {BUILD_DIR} / $ {CONFIGURATION} -iphoneos / $ {PROJECT_NAME} .framework”“$ {UNIVERSAL_OUTPUTFOLDER} /”

 #步骤3.将Swift模块(从iphonesimulator构建)复制到复制的框架目录
 cp -R“$ {BUILD_DIR} / $ {CONFIGURATION} -iphonesimulator / $ {PROJECT_NAME} .framework / Modules / $ {PROJECT_NAME} .swiftmodule /。”  “$ {UNIVERSAL_OUTPUTFOLDER} / $ {} PROJECT_NAME .framework /模块/ $ {} PROJECT_NAME .swiftmodule”

 #步骤4.使用lipo创建通用二进制文件,并将组合的可执行文件放在复制的框架目录中
 lipo -create -output“$ {UNIVERSAL_OUTPUTFOLDER} / $ {PROJECT_NAME} .framework / $ {PROJECT_NAME}”“$ {BUILD_DIR} / $ {CONFIGURATION} -iphonesimulator / $ {PROJECT_NAME} .framework / $ {PROJECT_NAME}”“$ {BUILD_DIR} / $ {}配置-iphoneos / $ {} PROJECT_NAME .framework / $ {} PROJECT_NAME”

 #步骤5.将框架复制到项目目录的便捷步骤
 cp -R“$ {UNIVERSAL_OUTPUTFOLDER} / $ {PROJECT_NAME} .framework”“$ {PROJECT_DIR}”

 #步骤6.在Finder中打开项目目录的便捷步骤
打开“$ {PROJECT_DIR}”

科幻

6)点击"cmd + B" (Build Project)

7)在Finder打开产品

在此处输入图像描述

8)向上导航1个目录(“cmd +↑”),您将看到"Release-universal"目录。 在此处输入图像描述

将有你的"fat/universal"库,你准备好了!

你可以通过检查

 file test.dylib test.dylib: Mach-O universal binary with 4 architectures test.dylib (for architecture i386): Mach-O dynamically linked shared library i386 test.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 test.dylib (for architecture armv7): Mach-O dynamically linked shared library arm test.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library 

我遇到了同样的问题,幸运的是我解决了它。

当您使用Xcode创建框架并使用iPhone 5模拟器或iPhone 5之前的模拟器(例如iPhone 4s或iPhone 4)构建框架时,您将获得具有i386架构的框架。如果您使用iPhone 5s模拟器或在iPhone 5s之后的simulatro,你将获得一个x86_64架构的框架。 但是如果您在项目中使用框架并且想要在模拟器上运行应用程序,则框架必须包含i386和x86_64体系结构,否则您将收到链接器错误。 所以你需要使用lipo -create命令来合并两个框架,此时你的框架已经可以使用了。

转到构建设置 – > 构建活动架构设置为

在iPhone 5和iPhone 6或更高版本的模拟器中构建您的框架。

在post操作中添加运行脚本以生成通用框架。

转到终端并键入cd(框架的路径,或拖放框架) ,它将带您进入frameworks目录

输入文件YOUR_FRAMEWORK_NAME ,其中列出了您的框架支持的所有体系结构

你可以看到你的框架支持所有四种架构i386,x86_64,armv7 arm64。

活动架构=>无有效架构=>“armv7 armv7s arm64 i386 x86_64”

在聚合时使用上面的构建设置!!! 我为所有架构框架创建工作