Xcode - 找不到架构 x86_64 (iOS Lib) 的符号 [英] Xcode - symbol(s) not found for architecture x86_64 (iOS Lib)

查看:42
本文介绍了Xcode - 找不到架构 x86_64 (iOS Lib) 的符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个静态库.构建设置将架构设置为:$(ARCHS_STANDARD) 显示为 Standard Architectures (armv7, armv7s, arm64) 我选择 iOS 设备构建库,然后使用模拟器(例如 iPhone Retina).

现在我有两个版本(一个在 Debug-iphoneos 内,另一个在 Debug-iphonesimulator 内,我使用 lipo -create创建聚合库:

lipo -create path/to/first/lib/path/to/second/lib -o MyLib.a

如果我在另一个项目中使用这个库在任何具有 64 位架构的 iOS 设备上进行模拟,它会给出找不到架构 x86_64 的符号.真正让我生气的是 lib 项目本身与另一个使用 lib 的项目位于一个工作区中.我可以在 64 位 iOS 模拟器上模拟!(在所有模拟器和设备上).我做错了什么?

注意事项:

  1. 这不是重复的问题.在指责我之前(因为这是我尝试解决这个愚蠢问题的第二天),我确实在 Stack 和 Google 上进行了搜索.所有的答案都没有帮助.
  2. 我使用的是 Xcode 5.1.1.

解决方案

我在构建静态库时遇到了同样的问题.
最后我找到了基本的解决方案.(需要为x86_64/armv7/armv7s/arm64构建通用库)

1) 点击项目文件
2) 点击目标
3) 打开构建阶段"
4) 打开运行脚本"
5) 添加"/bin/sh"和下面的脚本

<前>########################################## c.f.http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4## 2.7 版## 最新变化:# - 支持 iPhone 5/iPod Touch 5(使​​用 Apple 的解决方法来解决 lipo 错误)## 目的:# 在 XCode 中自动为 iPhone + iPad + iPhone 模拟器创建通用静态库## 作者:Adam Martin - http://twitter.com/redglassesapps# 基于:来自 Eonil 的原始脚本(主要变化:Eonil 的脚本在 Xcode GUI 中不起作用 - 它会导致您的计算机崩溃)#设置 -eset -o 管道故障#################[ 测试:帮助解决 Xcode 中的任何未来错误 ]#########DEBUG_THIS_SCRIPT="假"if [ $DEBUG_THIS_SCRIPT = "true" ]然后回声########### 测试#############"echo "调试此脚本时使用以下变量;注意它们可能会在递归时更改"echo "BUILD_DIR = $BUILD_DIR"echo "BUILD_ROOT = $BUILD_ROOT"echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR"echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR"echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR"echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR"菲#####################[ 第1部分 ]################### 首先,计算出 BASESDK 版本号(注意:Apple 应该报告这一点,但他们隐藏了它)#(顺便说一句:在 sh 中搜索子字符串是一场噩梦!呜咽)SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.{3}$')# 接下来,确定我们是在 SIM 还是 DEVICEif [ ${PLATFORM_NAME} = "iphonesimulator" ]然后OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}别的OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}菲echo "XCode 选择了 SDK: ${PLATFORM_NAME} 版本: ${SDK_VERSION} (虽然反向定位: ${IPHONEOS_DEPLOYMENT_TARGET})"echo "...因此,OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}"#####################[ 第 1 部分结束 ]#######################################[ 第2部分 ]#################### 如果这是原始调用,则调用需要其他构建的任何内容## Xcode 已经在构建一个目标...## ...但这是一个库,所以苹果将它设置为只构建一个是错误的.# ...我们需要构建所有目标# ...我们不能重新构建已经构建的目标:如果你尝试这个,Xcode 会崩溃你的计算机(无限递归!)### 所以:只构建缺少的平台/配置.if [ "true" == ${ALREADYINVOKED:-false} ]然后echo "递归:我不是根调用,所以我不会递归"别的# 危急:# 防止无限递归(Xcode 很烂)导出 ALREADYINVOKED="true"echo "递归:我是根......现在递归所有丢失的构建目标......"echo "RECURSION: ...即将调用:xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR"BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"行动=构建"#将所有平台二进制文件合并为每个配置的胖二进制文件.# 计算(多个)构建文件的来源:CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneosCURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulatorecho "从以下位置获取设备构建:${CURRENTCONFIG_DEVICE_DIR}"echo "从 ${CURRENTCONFIG_SIMULATOR_DIR} 获取模拟器构建"CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-通用echo "...我将输出一个通用版本到:${CREATING_UNIVERSAL_DIR}"# ... 删除此脚本之前运行的产品# 注意:此目录仅由此脚本创建 - 删除应该是安全的!rm -rf "${CREATING_UNIVERSAL_DIR}"mkdir "${CREATING_UNIVERSAL_DIR}"#echo "lipo: for current configuration (${CONFIGURATION}) 创建输出文件:${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}"xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"############ 添加:StackOverflow 建议也复制包含"文件#(未经测试,但应该可以正常工作)#echo "从 ${PUBLIC_HEADERS_FOLDER_PATH} 获取头文件"echo "(如果你将你的库项目嵌入到另一个项目中,你将需要添加"回声一个用户搜索标题"构建设置:(注意包括下面的双引号!)"echo '"$(TARGET_BUILD_DIR)/usr/local/include/"'if [ -d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" ]然后mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"# * 需要在双引号之外吗?cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"菲菲

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

7) 在 Finder

中打开产品

8) 向上导航 1 个目录(cmd + ↑"),您将看到 Release-universal" 目录.

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

I am building a static library. The build setting has the Architectures set to: $(ARCHS_STANDARD) which is shown as Standard Architectures (armv7, armv7s, arm64) I build the lib choosing iOS Device AND then using the simulator (for example iPhone Retina).

Now that I have two builds (one inside Debug-iphoneos and the other inside Debug-iphonesimulator, I use lipo -create to create the aggregated lib:

lipo -create path/to/first/lib /path/to/second/lib -o MyLib.a

If I used this library in another project to simulate on any iOS device with 64-bit architecture, it gives symbol(s) not found for architecture x86_64. What really makes me so angry that the lib project itself is inside a workspace with another project that use the lib. I can simulate on 64-bit iOS simulator! (on all simulators and devices for that matter). What am I doing wrong?

Notes:

  1. This is not duplicate Q. Before accusing me of that (since this is my second day trying to fix this stupid issue), I did search on Stack and Google. All answers don't help.
  2. I am using Xcode 5.1.1.

解决方案

I had the same trouble with building static library.
Finally I have found the basic solution. (You need to build universal library for x86_64/armv7/armv7s/arm64)

1) Click on the project file
2) Click on the target
3) Open "Build Phases"
4) Open "Run Script"
5) Add "/bin/sh" and the script below

##########################################
#
# c.f. http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4
#
# Version 2.7
#
# Latest Change:
# - Supports iPhone 5 / iPod Touch 5 (uses Apple's workaround to lipo bug)
#
# Purpose:
#   Automatically create a Universal static library for iPhone + iPad + iPhone Simulator from within XCode
#
# Author: Adam Martin - http://twitter.com/redglassesapps
# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)
#

set -e
set -o pipefail

#################[ Tests: helps workaround any future bugs in Xcode ]########
#
DEBUG_THIS_SCRIPT="false"

if [ $DEBUG_THIS_SCRIPT = "true" ]
then
echo "########### TESTS #############"
echo "Use the following variables when debugging this script; note that they may change on recursions"
echo "BUILD_DIR = $BUILD_DIR"
echo "BUILD_ROOT = $BUILD_ROOT"
echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR"
echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR"
echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR"
echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR"
fi

#####################[ part 1 ]##################
# First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)
#    (incidental: searching for substrings in sh is a nightmare! Sob)

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.{3}$')

# Next, work out if we're in SIM or DEVICE

if [ ${PLATFORM_NAME} = "iphonesimulator" ]
then
OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}
else
OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}
fi

echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})"
echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}"
#
#####################[ end of part 1 ]##################

#####################[ part 2 ]##################
#
# IF this is the original invocation, invoke WHATEVER other builds are required
#
# Xcode is already building ONE target...
#
# ...but this is a LIBRARY, so Apple is wrong to set it to build just one.
# ...we need to build ALL targets
# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)
#
#
# So: build ONLY the missing platforms/configurations.

if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse"
else
# CRITICAL:
# Prevent infinite recursion (Xcode sucks)
export ALREADYINVOKED="true"

echo "RECURSION: I am the root ... recursing all missing build targets NOW..."
echo "RECURSION: ...about to invoke: xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"

xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"

ACTION="build"

#Merge all platform binaries as a fat binary for each configurations.

# Calculate where the (multiple) built files are coming from:
CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos
CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator

echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}"
echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}"

CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}"

# ... remove the products of previous runs of this script
#      NB: this directory is ONLY created by this script - it should be safe to delete!

rm -rf "${CREATING_UNIVERSAL_DIR}"
mkdir "${CREATING_UNIVERSAL_DIR}"

#
echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}"
xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"

#########
#
# Added: StackOverflow suggestion to also copy "include" files
#    (untested, but should work OK)
#
echo "Fetching headers from ${PUBLIC_HEADERS_FOLDER_PATH}"
echo "  (if you embed your library project in another project, you will need to add"
echo "   a "User Search Headers" build setting of: (NB INCLUDE THE DOUBLE QUOTES BELOW!)"
echo '        "$(TARGET_BUILD_DIR)/usr/local/include/"'
if [ -d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" ]
then
mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
# * needs to be outside the double quotes?
cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
fi
fi

6) Hit "cmd + B" (Build Project)

7) Open Product in Finder

8) Navigate 1 directory up ("cmd + ↑"), and you will see "Release-universal" directory.

There will be your "fat/universal" library, You are ready to go!

这篇关于Xcode - 找不到架构 x86_64 (iOS Lib) 的符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆