Ber*_*rnd 11 cocoa-touch frameworks objective-c ios swift
在构建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)
Run Code Online (Sandbox Code Playgroud)
根据各种现有答案和扩展研究,我已经将i386添加到架构构建设置中......

然而,这似乎没有效果.当我检查使用
lipo -info TesterFrameworkObjC
Run Code Online (Sandbox Code Playgroud)
我只能得到
Architectures in the fat file: TesterFrameworkObjC are: armv7 arm64
Run Code Online (Sandbox Code Playgroud)
...不应该在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
Run Code Online (Sandbox Code Playgroud)
查看模拟器的最终构建文件夹构建
Build/Products/Debug-iphoneos/TesterFrameworkSwift.framework/
Run Code Online (Sandbox Code Playgroud)
我可以看到架构仍然缺失,尽管它们是框架的一部分(如图所示).在构建应用程序时,如何确保包含框架的所有正确架构版本?
看看我的所有错误消息,看起来问题实际上并没有构建错误的产品/架构,但是一步之后,Linker没有使用正确的路径.不确定这是多么正确.
l0g*_*g3r 35
这和我的问题一样.
似乎这是一个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

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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14975 次 |
| 最近记录: |