Xcode - 找不到架构 x86_64 (iOS Lib) 的符号

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24346637/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 01:02:42  来源:igfitidea点击:

Xcode - symbol(s) not found for architecture x86_64 (iOS Lib)

iosxcode564-bitstatic-libraries

提问by Abdalrahman Shatou

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).

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

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

现在我有两个构建(一个在里面Debug-iphoneos,另一个在里面Debug-iphonesimulator,我lipo -create用来创建聚合库:

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?

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

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

采纳答案by l0gg3r

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)

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

enter image description here

在此处输入图片说明

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

1) 点击项目文件
2) 点击目标
3) 打开"Build Phases"
4) 打开"Run Script"
5) 添加"/bin/sh"和下面的脚本

##########################################
#
# 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)

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

7) Open Product in Finder

7) 打开产品 Finder

enter image description here

在此处输入图片说明

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

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

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

会有你的"fat/universal"图书馆,你准备好了!

回答by Aleksandar Vaci?

I encountered this with a framework lib I'm using in one of my apps, when I tried to test it in iPhone Retina 64bit simulator.

当我尝试在 iPhone Retina 64 位模拟器中测试它时,我在我的一个应用程序中使用的框架库遇到了这个问题。

I simply added x86_64as an architecture to build for and set it to always build for all architectures. Worked a charm.

我只是将其添加x86_64为要构建的架构,并将其设置为始终为所有架构构建。发挥了魅力。

enter image description here

在此处输入图片说明

回答by quellish

The lipotool can not only create fat mach-o binaries, but it can inspect them: xcrun lipo -info /path/to/libThing.a

lipo工具不仅可以创建胖 mach-o 二进制文件,还可以检查它们: xcrun lipo -info /path/to/libThing.a

This will output what architectures are in the file. Before you join binaries using lipo, run this to make sure the architectures you expect are present. It's also a good idea to run this on the product of a fat binary join.

这将输出文件中的架构。在使用 lipo 加入二进制文件之前,运行它以确保您期望的架构存在。在胖二进制连接的产品上运行它也是一个好主意。

In your case you need:

在您的情况下,您需要:

iPhoneSDK Configuration: armv7, armv7s, arm64

iPhoneSDK 配置:armv7、armv7s、arm64

iPhoneSimulator Configuration: i386, x86_64

iPhone模拟器配置:i386、x86_64

It seems that the iPhoneSimulator build product is not producing an x86_64 binary based on your question. Check your build configuration - in particular, "Build Active Architectures Only" (ONLY_ACTIVE_ARCH) should be set to NO. The default is for this to be NO for Release, but YES for debug. If it is YES, only one architecture will be in the build product.

根据您的问题,iPhoneSimulator 构建产品似乎没有生成 x86_64 二进制文件。检查您的构建配置 - 特别是,“仅构建活动架构”( ONLY_ACTIVE_ARCH) 应设置为 NO。默认情况下,Release 为 NO,调试为 YES。如果是,则构建产品中将只有一种架构。

回答by Pratik Patel

Go to your application project Targetand look in Library Search Path.

转到您的应用程序项目Target并查看Library Search Path

Now check that your library file path should be written in double quotes:

现在检查你的库文件路径是否应该用双引号写:

"$(SRCROOT)/MyAppTest/TestFlight"

If there is no double quote then just add them and compile the project.

如果没有双引号,则只需添加它们并编译项目。

Hope it will work for you.

希望它对你有用。