【问题标题】:Static library dependency compiles in simulator on Xcode 3.2.3, fails on device静态库依赖项在 Xcode 3.2.3 上的模拟器中编译,在设备上失败
【发布时间】:2010-07-08 19:01:01
【问题描述】:

升级到 XCode 3.2.3 和 iPhone 3.2/4.0 SDK 在我的构建过程中引入了一个奇怪的错误。

我有一个静态库 Compton,它本身依赖于three20。我将 Compton 构建为它所支持的客户端应用程序的依赖项。

当我在模拟器或设备模式、3.2 或 4.0 SDK 中将 Compton 编译为自己的项目时,一切都编译正常,没有错误。

当我使用 3.2 或 4.0 SDK、模拟器、针对 3.2 上的 iPhone 或 iPhone/iPad 编译引用 Compton 的客户端应用程序时,一切正常,没有编译错误,并且应用程序在模拟器中按预期运行。

当我编译完全相同的项目时,除了从模拟器到设备的构建设置之外什么都没有改变,但是,我得到以下链接错误,经过数小时的 #import 语句、搜索路径、构建设置,我似乎无法消除这些错误等。我真正感到沮丧的部分是模拟器版本正在构建和运行良好,这似乎是一个很小的配置问题。我在下面粘贴错误,从在设备模式下构建我的项目的角度来看,它看起来像 Compton 类,无法“看到”某些三个 20 标题。

我用的是three20的trunk版,今天拉的。

这是链接错误的输出:

Ld build/NewBlankComptonTemplate.build/Debug-iphoneos/NewBlankComptonTemplate.build/Objects-normal/armv7/NewBlankComptonTemplate normal armv7
cd /Users/wiley/iphone_projects/ComptonQuizzes/NewBlankComptonTemplate
setenv IPHONEOS_DEPLOYMENT_TARGET 4.0
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk -L/Users/wiley/iphone_projects/ComptonQuizzes/NewBlankComptonTemplate/build/Debug-iphoneos -F/Users/wiley/iphone_projects/ComptonQuizzes/NewBlankComptonTemplate/build/Debug-iphoneos -filelist /Users/wiley/iphone_projects/ComptonQuizzes/NewBlankComptonTemplate/build/NewBlankComptonTemplate.build/Debug-iphoneos/NewBlankComptonTemplate.build/Objects-normal/armv7/NewBlankComptonTemplate.LinkFileList -dead_strip -ObjC -miphoneos-version-min=4.0 -framework Foundation -framework UIKit -framework CoreGraphics -framework AudioToolbox -framework AVFoundation -framework CFNetwork -framework MediaPlayer -framework MessageUI -framework MobileCoreServices -framework QuartzCore -framework StoreKit -framework SystemConfiguration -lxml2 -lz.1.2.3 /Users/wiley/iphone_projects/ComptonQuizzes/libs/Compton/src/build/Debug-iphoneos/libCompton.a -o /Users/wiley/iphone_projects/ComptonQuizzes/NewBlankComptonTemplate/build/NewBlankComptonTemplate.build/Debug-iphoneos/NewBlankComptonTemplate.build/Objects-normal/armv7/NewBlankComptonTemplate

Undefined symbols:
  "_OBJC_CLASS_$_TTStyleSheet", referenced from:
      objc-class-ref-to-TTStyleSheet in AppDelegate.o
  "_OBJC_CLASS_$_TTURLAction", referenced from:
      objc-class-ref-to-TTURLAction in AppDelegate.o
  "_OBJC_CLASS_$_TTRoundedRectangleShape", referenced from:
      objc-class-ref-to-TTRoundedRectangleShape in libCompton.a(ComptonStyleSheet.o)
  "_OBJC_METACLASS_$_TTDefaultStyleSheet", referenced from:
      _OBJC_METACLASS_$_ComptonStyleSheet in libCompton.a(ComptonStyleSheet.o)
  "_OBJC_CLASS_$_TTView", referenced from:
      objc-class-ref-to-TTView in libCompton.a(ComptonQuizStartController.o)
  "_OBJC_CLASS_$_TTShapeStyle", referenced from:
      objc-class-ref-to-TTShapeStyle in libCompton.a(ComptonQuizStartController.o)
  "_OBJC_CLASS_$_TTInnerShadowStyle", referenced from:
      objc-class-ref-to-TTInnerShadowStyle in libCompton.a(ComptonQuizStartController.o)
  "_OBJC_METACLASS_$_TTViewController", referenced from:
      _OBJC_METACLASS_$_ComptonFeedbackController in libCompton.a(ComptonFeedbackController.o)
      _OBJC_METACLASS_$_ComptonCatalogController in libCompton.a(ComptonCatalogController.o)
      _OBJC_METACLASS_$_ComptonQuizStartController in libCompton.a(ComptonQuizStartController.o)
      _OBJC_METACLASS_$_PILAppAdViewController in libCompton.a(PILAppAdViewController.o)
      _OBJC_METACLASS_$_ComptonQuizController in libCompton.a(ComptonQuizController.o)
  "_OBJC_CLASS_$_TTURLCache", referenced from:
      objc-class-ref-to-TTURLCache in libCompton.a(ComptonFeedbackController.o)
  "_OBJC_CLASS_$_TTSolidBorderStyle", referenced from:
      objc-class-ref-to-TTSolidBorderStyle in libCompton.a(ComptonQuizStartController.o)
  "_OBJC_CLASS_$_TTViewController", referenced from:
      _OBJC_CLASS_$_ComptonFeedbackController in libCompton.a(ComptonFeedbackController.o)
      _OBJC_CLASS_$_ComptonCatalogController in libCompton.a(ComptonCatalogController.o)
      _OBJC_CLASS_$_ComptonQuizStartController in libCompton.a(ComptonQuizStartController.o)
      _OBJC_CLASS_$_PILAppAdViewController in libCompton.a(PILAppAdViewController.o)
      _OBJC_CLASS_$_ComptonQuizController in libCompton.a(ComptonQuizController.o)
  "_OBJC_CLASS_$_TTNavigator", referenced from:
      objc-class-ref-to-TTNavigator in AppDelegate.o
  "_OBJC_CLASS_$_TTPostController", referenced from:
      objc-class-ref-to-TTPostController in libCompton.a(ComptonFeedbackController.o)
  "_OBJC_CLASS_$_TTRoundedRightArrowShape", referenced from:
      objc-class-ref-to-TTRoundedRightArrowShape in libCompton.a(ComptonStyleSheet.o)
  "_OBJC_CLASS_$_TTButton", referenced from:
      objc-class-ref-to-TTButton in libCompton.a(ComptonFeedbackController.o)
  "_OBJC_CLASS_$_TTSolidFillStyle", referenced from:
      objc-class-ref-to-TTSolidFillStyle in libCompton.a(ComptonQuizStartController.o)
  "_OBJC_CLASS_$_TTWebController", referenced from:
      objc-class-ref-to-TTWebController in AppDelegate.o
  "_TTScreenBounds", referenced from:
      -[ComptonCatalogController viewDidLoad] in libCompton.a(ComptonCatalogController.o)
      -[PILAppAdViewController viewDidLoad] in libCompton.a(PILAppAdViewController.o)
  "_OBJC_CLASS_$_TTDefaultStyleSheet", referenced from:
      _OBJC_CLASS_$_ComptonStyleSheet in libCompton.a(ComptonStyleSheet.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status

谁能帮我弄清楚这里可能出了什么问题?

更新:我已经通过使用three20 和process described here 的fork 并删除three20 和Compton 上的-all_load 链接器标志消除了重复符号链接错误。我被困在的真正疯狂的问题仍然存在:我可以在模拟器中很好地编译和运行应用程序,但是在为设备编译时,我得到了上述链接错误。

更新 2:我已经解决了这个问题,添加了一个答案并接受了它。问题确实是构建配置设置 - 如果您使用的是 4.0 SDK,则需要将“Architectures”设置为“Optimized (armv7)”。

【问题讨论】:

  • 您是否在构建相同的目标和相同的配置?
  • @cory.m.smith 我的客户端应用程序的“Targeted Device Family”设置为“iPhone”,其“Base SDK”设置为“iPhone Device 4.0”。这是你要问的吗?
  • 这个链接看起来很有希望:stackoverflow.com/questions/2456795/…
  • 如果您仍然遇到此问题,那么您在某处仍有 -all_load。您永远不会在模拟器中遇到此错误,因此在那里修复它无济于事。更改为 armv7 仅意味着您的应用无法在我的 iPhone 3G 上运行。也许对你来说不是问题。我建议专门设置 armv6 - 它可以在任何东西上运行,并且不需要我的博客文章中的骇客。

标签: iphone xcode linker three20 static-libraries


【解决方案1】:

据我所知,您在构建 libCompton 的同时直接喜欢three20,这只会导致地狱。将静态库链接在一起并尝试在最终项目中使用它不会很有趣。也可以将three20链接到您的应用程序,它应该可以解决您的问题,compton 应该只需要标头即可编译,它只需要这些符号出现在您的应用程序的最终链接中。

【讨论】:

  • 这真的很有趣 - 所以你是说在我的 Compton 构建设置中,我为 three20 设置了正确的标头搜索路径,但实际上并没有在 Compton 中包含对three20 项目文件的引用项目。相反,您建议将对three20 项目的文件引用放在我的应用程序中,并将其构建为应用程序的依赖项,而不是康普顿的依赖项。这是正确的吗?
  • 是的,我用其他静态库做过类似的事情。可以这样,依然使用armv6+armv7
【解决方案2】:

我现在已经解决了这个问题,答案来自 Apple 开发者论坛。如果将基础 SDK 设置为 > 3.2,则需要将 Build settings 中的“Architectures”选项设置为 Optimized (armv7)。

代码现在可以在模拟器和设备上编译并正常运行。

【讨论】:

  • 请注意,我们中的一些人拥有不支持 armv7 的 iOS 4.0 设备...指定 armv6 专门解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2012-05-16
  • 2021-01-28
  • 1970-01-01
相关资源
最近更新 更多