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

时间:2015-02-21 23:29:16

标签: ios objective-c cocoa-touch swift frameworks

构建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 添加到体系结构构建设置......

enter image description here

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

检查时
lipo -info TesterFrameworkObjC

我只得到

Architectures in the fat file: TesterFrameworkObjC are: armv7 arm64

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

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


一些新的见解

使用此版本build script我能够为Swift版本的框架构建缺少的体系结构。

enter image description here

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

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/

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


更新

查看我的所有错误消息,看起来这个问题实际上并没有构建错误的产品/架构,但是稍后在那里链接器不是使用正确的路径。不确定这是多么正确。

4 个答案:

答案 0 :(得分:34)

这与我的problem相同。

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

另请注意

  

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

     

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

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

此外,您的脚本中存在递归问题,我已对其进行了更正。

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: Detected, stopping"
else
export ALREADYINVOKED="true"

# Step 1. Build Device and Simulator versions
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

# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"

# Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"

# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"

# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"

# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"

fi

6)点击"cmd + B"(建设项目)

7)在Finder

中打开产品

enter image description here

8)向上导航1个目录(“cmd +↑”),您将看到"Release-universal"目录。 enter image description here

你的"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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

转到构建设置->将仅构建活动体系结构设置为

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

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

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

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

您会看到您的框架支持所有四种架构i386,x86_64,armv7 arm64。

答案 3 :(得分:-3)

Active Architecture =>没有 有效架构=> " armv7 armv7s arm64 i386 x86_64"

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