【问题标题】:Xcode - symbol(s) not found for architecture x86_64 (iOS Lib)Xcode - 未找到架构 x86_64 (iOS Lib) 的符号
【发布时间】:2014-08-12 08:30:57
【问题描述】:

我正在构建一个静态库。构建设置将架构设置为:$(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 设备上进行模拟,它会给出symbol(s) not found for architecture x86_64。真正让我生气的是,lib 项目本身与另一个使用 lib 的项目位于一个工作区中。我可以在 64 位 iOS 模拟器上进行模拟! (在所有模拟器和设备上)。我做错了什么?

注意事项:

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

【问题讨论】:

  • 你用的是操作系统自带的lipo还是Xcode?要使用 Xcode,请运行“xcrun -sdk iphoneos lipo [arguments as before]”。也许这会有所帮助。
  • 老实说,我对你的问题感到很困惑,但有两件事要检查......首先你应该看看“构建活动架构”是否设置为是或否。如果它设置为是,那么它只是为那个设备构建的。如果您选择“否”,它将构建所有 3 个。其次,我会从终端输入“file MyLib.a”,它会告诉您胖静态库中实际包含哪些架构。
  • 确保“i386 x86_64”和“arm7 arm7s arm64”在您的目标的“VAILD_ARCHS”构建设置下列出。

标签: ios xcode5 64-bit static-libraries


【解决方案1】:

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

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

######################################### # # 参考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 bug) # # 目的: # 在 XCode 中自动为 iPhone + iPad + iPhone Simulator 创建一个通用静态库 # # 作者:亚当·马丁 - http://twitter.com/redglassesapps # 基于:来自 Eonil 的原始脚本(主要变化:Eonil 的脚本在 Xcode GUI 中将不起作用 - 它会使您的计算机崩溃) # 设置-e 设置-o pipefail #################[测试:帮助解决Xcode中的任何未来错误]######## # DEBUG_THIS_SCRIPT="假" 如果 [ $DEBUG_THIS_SCRIPT = "true" ] 然后 echo "########### 测试#############" echo "调试此脚本时使用以下变量;注意它们可能会在递归时发生变化" 回声“BUILD_DIR = $BUILD_DIR” 回声“BUILD_ROOT = $BUILD_ROOT” 回声“CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR” 回声“BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR” 回声“CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR” 回声“TARGET_BUILD_DIR = $TARGET_BUILD_DIR” 菲 #####################[ 第1部分 ]################## # 首先,计算出 BASESDK 版本号(注意:Apple 应该报告这一点,但他们隐藏了它) # (顺便说一句:在 sh 中搜索子字符串是一场噩梦!呜咽) SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\{3\}$') # 接下来,确定我们是在 SIM 还是 DEVICE 如果 [ ${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 已经在构建一个目标... # # ...但这是一个库,所以 Apple 将其设置为仅构建一个是错误的。 # ...我们需要构建所有目标 # ...我们不能重新构建已经在构建的目标:如果你尝试这个,Xcode 会导致你的计算机崩溃(无限递归!) # # # 所以:只构建缺少的平台/配置。 如果 [ "true" == ${ALREADYINVOKED:-false} ] 然后 echo "RECURSION: 我不是根调用,所以我不会递归" 别的 # 危急: # 防止无限递归(Xcode 很烂) 导出 ALREADYINVOKED="true" echo "RECURSION: 我是根...现在递归所有缺少的构建目标..." 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}-iphoneos CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator echo "从 ${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: 为当前配置 (${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 " 一个 "用户搜索标题" 构建设置:(注意包括下面的双引号!)" echo '"$(TARGET_BUILD_DIR)/usr/local/include/"' 如果 [ -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"(构建项目)

7) 在Finder 中打开产品

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

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

【讨论】:

  • 这是最好的答案。只是出于好奇,如何使用 cmd-B 构建“发布”版本。据我所知, cmd-b 构建了一个“调试”版本。我必须使用 Product > Archive 来构建“发布”版本。
  • 我更改了构建配置,步骤如下 [1]:i.stack.imgur.com/RqWkL.png [2]:i.stack.imgur.com/xZayM.png [3]:i.stack.imgur.com/xk5on.png
  • 到目前为止有没有办法不使用这个脚本?我的意思是,如果我们在不使用脚本的情况下再次构建模拟器和设备,则会创建两个文件夹。这些中的 lib 文件给出“未找到符号”错误。那么这两个 lib 文件是干什么用的呢?
【解决方案2】:

当我尝试在 iPhone Retina 64 位模拟器中对其进行测试时,我在我的一个应用程序中使用了一个框架库。

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

【讨论】:

  • @aleksandar-vacic 我尝试了你展示的方式。但这对我不起作用。
【解决方案3】:

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

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

根据您的情况,您需要:

iPhoneSDK 配置: armv7、armv7s、arm64

iPhone模拟器配置: i386、x86_64

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

【讨论】:

  • +1 用于提示选择 YES 进行调试,这是我的情况。
【解决方案4】:

转到您的应用程序项目Target并查看库搜索路径

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

"$(SRCROOT)/MyAppTest/TestFlight"

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

希望它对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2019-03-10
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多