【问题标题】:iOS compile library/framework linker flags issues compiling for device but not simulatoriOS 编译库/框架链接器标志问题为设备而不是模拟器编译
【发布时间】:2013-11-04 11:10:42
【问题描述】:

背景:

我正在尝试将 Phonegap 与 cocoapods 一起使用。 Phonegap 已经有从命令行编译的问题,所以我只是将 Xcode 与生成的项目文件一起使用(假设我在使用 cocoapods 时无论如何都必须这样做)。

我已经在 Github 上推送了一个复制的空项目,其中包含我的问题: https://github.com/Dan2552/phonegap-reproducable-issue

您可以在 repo 的根目录中的 build_ios 脚本中看到我在制作一个全新的全新 Phonegap 应用程序后所做的步骤。但是我也推送了生成的项目文件(平台/ios),所以没有Phonegap的任何人都应该能够打开该项目。

问题:

我在编译时遇到了一个奇怪的问题。可能是预先捆绑的 Cordova 库和 cocoapods 的问题。

在使用 Phonegap 生成项目并添加 cocoapods 后不执行任何操作构建时,出现以下错误:

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_OTPublisher", referenced from:
  objc-class-ref in libPods.a(OpenTokPlugin.o)
"_OBJC_CLASS_$_OTSession", referenced from:
  objc-class-ref in libPods.a(OpenTokPlugin.o)
"_OBJC_CLASS_$_OTSubscriber", referenced from:
  objc-class-ref in libPods.a(OpenTokPlugin.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Cocoapods 警告:

[!] 目标 HelloWorld [Debug] 覆盖在 `Pods/Pods.xcconfig' 中定义的 OTHER_LDFLAGS 构建设置。

[!] 目标 HelloWorld [Debug - Release] 覆盖在 `Pods/Pods.xcconfig' 中定义的 OTHER_LDFLAGS 构建设置。

因此我尝试完全删除OTHER_LDFLAGS(Xcode 中的“其他链接器标志”)条目。 这可以在 iOS 设备上成功编译,但不能在模拟器上编译,项目也不会在存档上构建。

为模拟器构建会得到与以前相同的错误 (Undefined symbols for architecture)

存档建筑将获得 /Users/dan2552/projects/ReproducableProblems/OpenTokPhonegap/Classes/OpentokPlugin.h:9:9: 'Cordova/CDVPlugin.h' file not found

我还尝试将$(inherited) 放入OTHER_LDFLAGS,这与删除它们产生的结果相同。

【问题讨论】:

  • 想知道为什么在 ARM 构建中出现 i.386 错误?您是否正在尝试链接 Intel i.386 库而不是 ARM ?与 Android Intel Atom 支持或 Android 模拟器有关吗?不确定,因为我没有在愤怒中使用过 PhoneGap。
  • Android 无论如何都不应该影响它,如果你查看platforms/ios 目录,你会看到你得到了一个普通的(ish)Xcode 项目,但我同意这很奇怪——也许它编译了 i386对于模拟器(因为它不是模拟器)?

标签: ios xcode cordova build cocoapods


【解决方案1】:

您包含的框架没有 Simulator (i386) 切片:

$ xcrun -sdk iphoneos lipo -info Pods/OpenTokSDK-WebRTC/Opentok.framework/Versions/A/Opentok 
Architectures in the fat file: Pods/OpenTokSDK-WebRTC/Opentok.framework/Versions/A/Opentok are: armv7 armv7s

所以它的类不能链接到模拟器。


此外,如果您打算使用 CocoaPods,您可以完全删除 Cordova 项目和静态库,并将 pod 'Cordova' 添加到您的 Podfile。

【讨论】:

  • 我们已经放弃了Phonegap/Cordova。确实,OpenTok 不会为模拟器编译。我们通过在 OpenTok 特定类周围使用 #if TARGET_IPHONE_SIMULATOR 解决了编译问题。
【解决方案2】:

我之前在尝试运行 Xcode 项目而不是 XCWorkspace 时遇到过类似的问题。您遇到的问题听起来像是因为您没有运行工作区。

【讨论】:

    【解决方案3】:

    转到您的 taget 构建设置 -> 其他链接器标志 -> 双击 .将 $(inherited) 添加到新行。 .试试这个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多