【问题标题】:Linker error when compiling iOS 5 app for Simulator - Undefined symbols: _objc_assign_global, _objc_assign_ivar, and _objc_assign_strongCast为模拟器编译 iOS 5 应用程序时出现链接器错误 - 未定义符号:_objc_assign_global、_objc_assign_ivar 和 _objc_assign_strongCast
【发布时间】:2026-02-17 21:25:02
【问题描述】:

升级到自动引用计数后,我的项目不再针对 iOS 5.0 模拟器进行编译。它仍然可以为任何 iOS 设备完美编译。

此外,在升级到 iOS 5 之后,但在升级到自动引用计数之前,我的项目可以在设备和模拟器上完美编译。

链接器说它找不到以下符号:

  • _objc_assign_global
  • _objc_assign_ivar
  • _objc_assign_strongCast

一开始我以为我可能缺少一个模拟器特定的框架,但在添加了每个可用的框架后,我仍然得到相同的错误。

其他信息

  • iOS 部署目标是:4.0。
  • 操作系统是 Snow Leopard OSX 10.6.8 64bit
架构 i386 的未定义符号: “_objc_assign_global”,引用自: +[InAppPurchaseManager sharedInAppPurchaseManager] InAppPurchaseManager.o +[ThemeManager sharedThemeManager] 在 ThemeManager.o +[DownloadUpdatesManager sharedDownloadUpdatesManager] 在 DownloadUpdatesManager.o +[AudioManager sharedAudioManager] 在 AudioManager.o +[IOHelper sharedIOHelper] 在 IOHelper.o -[CKBezierPath svgStringPath] 在 CKBezierPath.o +[PreferencesManager defaultLineWidth] 在 PreferencesManager.o ... “_objc_assign_ivar”,引用自: -InAppPurchaseManager.o 中的[InAppPurchaseManager 初始化] -[InAppPurchaseManager addTransactionObserver:] InAppPurchaseManager.o -[InAppPurchaseManager removePurchaseTransactionObserver:] InAppPurchaseManager.o - [InAppPurchaseManager purchaseProduct:forThemeIDType:] InAppPurchaseManager.o -[InAppPurchaseManager productsRequest:didReceiveResponse:] InAppPurchaseManager.o - ThemeEditVC.o 中的[ThemeEditVC viewDidLoad] -[ThemeEditVC setDelegate:] 在 ThemeEditVC.o ... “_objc_assign_strongCast”,引用自: +[SFHFKeychainUtils getPasswordForUsername:andServiceName:error:] in SFHFKeychainUtils.o +[SFHFKeychainUtils storeUsername:andPassword:forServiceName:updateExisting:error:] 在 SFHFKeychainUtils.o +[SFHFKeychainUtils deleteItemForUsername:andServiceName:error:] in SFHFKeychainUtils.o Utility.o 中的 __replacePlaceholdersWithValues - [LocationManager checkForNewLocation:] 在 LocationManager.o -LocationManager.o 中的 [LocationManager getNewLocationInStringFormat] ___52-[LocationManager getNewLocationInStringFormat]_block_invoke_0 在 LocationManager.o ... ld: 未找到架构 i386 的符号

编辑:

Objective-C 垃圾收集设置为“支持”而不是“必需”。将其设置为“必需”后,出现错误:

ld:/Users/teacher/drawingapp/FlurryLib/libFlurryAnalytics.a(FlurryAnalytics.o) 使用不兼容的垃圾收集设置构建,以与架构 i386 的先前 .o 文件链接 命令 /Developer_4_2_ios5/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang 失败,退出代码为 1

删除 Flurry 库后,之前的错误信息又开始出现了。

编辑 2:

看起来垃圾收集只支持 OS X 而不是 iOS。我仍然不明白为什么它允许我在打开垃圾收集的设备上编译和运行应用程序,而不是在模拟器上。

无论如何,我刚刚将垃圾收集设置为“不支持”,但现在它将不再在设备上编译和运行。

我现在收到此错误:

/Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m 1. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:52:1: 当前解析器令牌'-' 2. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:39:1: LLVM IR 生成声明'PurchaseThemeOptionVC::viewDidLoad' 3. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:39:21: LLVM IR 生成复合语句('{}') clang:错误:无法执行命令:分段错误 clang:错误:clang 前端命令因信号 2 而失败(使用 -v 查看调用)

【问题讨论】:

    标签: objective-c xcode linker-errors automatic-ref-counting ios-simulator


    【解决方案1】:

    如果您启用垃圾收集,编译器应该只引用这些函数。您确定这些目标文件不是在启用垃圾收集的情况下编译的吗?

    【讨论】:

    • 垃圾收集刚刚设置为“支持”。我现在已将其设置为“必需”,但仍然有相同的链接器错误。
    • iOS 不支持垃圾回收。您需要将其完全关闭。
    • 你确定吗?当设置为“支持”或“必需”时,它可以很好地为设备编译。当我将其设置为“不支持”时,会出现奇怪的编译错误,例如“LLVM IR 生成复合语句 ('{}')”,这适用于模拟器和设备。
    • Advanced Memory Management Programming Guide: "如果你打算为 iOS 编写代码,你必须使用显式内存管理"。
    • 你说它编译得很好,但链接器告诉你垃圾收集相关的符号无法解析。
    【解决方案2】:

    如果您启用垃圾回收,编译器应该只引用这些函数

    不要忘记,如果您要链接到启用垃圾收集编译的库,则会引用 _objc_assign_global/ivar/strongCast 符号。

    【讨论】: