Обновление до XCode 3.2.3 и iPhone 3.2 / 4.0 SDK внесло странную ошибку в мой процесс сборки.

У меня есть статическая библиотека Compton, которая сама зависит от three20. Я строю Compton как зависимость от клиентских приложений, на которых он работает.

Когда я компилирую Compton как собственный проект в режиме симулятора или устройства, 3.2 или 4.0 SDK, все компилируется нормально, без ошибок.

Когда я компилирую клиентское приложение, которое ссылается на Комптон с помощью SDK 3.2 или 4.0, симулятора, ориентируясь на iPhone или iPhone / iPad на 3.2, все работает отлично, без ошибок компиляции, и приложение работает в симуляторе должным образом.

Однако, когда я компилирую один и тот же проект, ничего не меняя, кроме настроек сборки, от симулятора к устройству, я получаю следующие ошибки связывания, которые я не могу устранить после нескольких часов возни с операторами #import, путями поиска, настройками сборки, и т. д. Что меня действительно расстроило, так это то, что версии симуляторов строятся и работают нормально, это похоже на крошечную небольшую проблему с конфигурацией. Я вставляю ошибки ниже, похоже, что классы Комптона с точки зрения построения моего проекта в режиме устройства не могут «видеть» некоторые из трех20 заголовков.

Пользуюсь транковой версией three20, сегодня потянул.

Вот результат ошибок связывания:

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 и описанный здесь процесс и удаление флага компоновщика -all_load на three20 и Compton. По-настоящему сумасшедшая проблема, на которой я застрял, остается: я могу скомпилировать и запустить приложение в симуляторе, но при компиляции для устройства я получаю указанные выше ошибки связывания.

Обновление 2: я решил проблему, добавил ответ и принял его. Проблема действительно заключалась в настройке конфигурации сборки - если вы используете 4.0 SDK, вам нужно установить «Архитектуры» на «Оптимизированные (armv7)».

2
prairiedogg 8 Июл 2010 в 23:01
Вы создаете одну и ту же цель и ту же конфигурацию?
 – 
Smixx
8 Июл 2010 в 23:46
@ cory.m.smith Для "Целевого семейства устройств" моего клиентского приложения установлено значение "iPhone", а для его "Базового SDK" установлено значение "Устройство iPhone 4.0". Вы об этом спрашиваете?
 – 
prairiedogg
9 Июл 2010 в 01:23
Эта ссылка выглядит многообещающей с точки зрения ответа: stackoverflow.com/questions/2456795/…
 – 
prairiedogg
9 Июл 2010 в 01:41
Если у вас все еще есть эта проблема, значит, у вас все еще где-то есть -all_load. Вы никогда не получите эту ошибку в симуляторе, поэтому ее исправление там не поможет. Переход на armv7 означает, что ваше приложение не будет работать на моем iPhone 3G. Возможно, для вас это не проблема. Я рекомендую специально настроить armv6 - он будет работать на чем угодно и не требует взлома в моем сообщении в блоге.
 – 
jamie
30 Дек 2010 в 06:34

2 ответа

Лучший ответ

Я решил эту проблему, ответ пришел на форумах разработчиков Apple. Если вы установите базовый SDK на> 3.2, вам необходимо установить для параметра «Архитектуры» в настройках сборки значение «Оптимизировано» (armv7).

Теперь код компилируется и отлично работает на симуляторе и устройстве.

0
prairiedogg 15 Июл 2010 в 19:51
1
Обратите внимание, что у некоторых из нас есть устройства iOS 4.0, которые не поддерживают armv7 ... Указание armv6 специально решает эту проблему.
 – 
jamie
30 Дек 2010 в 06:29

Насколько я могу судить, вы создали libCompton, а вам понравилась его версия three20, это не вызовет ничего, кроме ад. Связывание статических библиотек вместе и попытки использовать их в окончательном проекте не принесут удовольствия. Свяжите three20 с вашим приложением, и это должно решить ваши проблемы, compton должны просто нуждаться в заголовках для компиляции, ему просто нужно, чтобы эти символы присутствовали при окончательной компоновке в вашем приложении.

1
Joshua Weinberg 15 Июл 2010 в 16:44
Это действительно интересно - вы говорите, что в моих настройках сборки для Compton я установил правильные пути поиска заголовков для three20, но на самом деле не включаю ссылки на файлы проекта three20 в проекте Compton. Вместо этого вы предлагаете поместить ссылки на файл проекта three20 в моем приложении и построить как зависимость приложения, а не Compton. Это верно?
 – 
prairiedogg
15 Июл 2010 в 19:13
Да, я делал то же самое с другими статическими библиотеками. Вы можете сделать это и по-прежнему использовать armv6 + armv7
 – 
Joshua Weinberg
15 Июл 2010 в 22:13