it-swarm.com.ru

Xcode 4 build успешно, сборка командной строки не удается?

У меня есть проект в Xcode 4 (последняя не бета-версия), который прекрасно работает при сборке в самом Xcode. В частности, команда Ld правильно использует каталог производных данных (где размещаются продукты сборки, включая зависимую статическую библиотеку).

Однако, когда я собираю тот же проект из командной строки, команда Ld завершается неудачно, так как она пытается использовать папку/build в проекте, который не заполняется.

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

Любые идеи о том, где начать отладку этого? Я могу предоставить больше информации по мере необходимости.

Правка 1: Полная команда сборки Xcode:

xcodebuild -project AppName.xcodeproj -target AppName -configuration "Config Name"

Где AppName и Config Name являются правильными значениями для сборки.

Правка 2: Команды Link (Ld).

Когда встроен в Xcode (это работает):

Ld /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName normal i386
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv MACOSX_DEPLOYMENT_TARGET 10.6
setenv PATH "/Developer/Platforms/iPhoneSimulator.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/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -Arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName -F/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -filelist /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/i386/AppName.LinkFileList -mmacosx-version-min=10.6 -lxml2 -all_load -ObjC -licucore -Xlinker -objc_abi_version -Xlinker 2 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName

При сборке из командной строки с использованием команды сборки выше (это не удается):

Ld "build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName" normal armv6
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv IPHONEOS_DEPLOYMENT_TARGET 4.0
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/X11/bin:/opt/local/bin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -Arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk "-L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName "-F/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -filelist "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName.LinkFileList" -dead_strip -lxml2 -all_load -ObjC -licucore -miphoneos-version-min=4.0 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName"

Который возвращает:

ld: library not found for -lMyClientLibrary
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
37
James J

Итак, почти через 6 (оплачиваемых) часов я собрал сборку для корректной работы в XCode и в командной строке (и на сервере сборки, весь смысл этого упражнения).

Попутно я бы исправил одну проблему, просто чтобы вызвать другую - я бы, по-видимому, исправил проблему компоновщика/Ld, только чтобы вызвать проблемы при компиляции («SomeClass undeclared (сначала использовать в этой функции)» или «SomeHeader.h: такого файла нет или каталог "ошибки были распространены).

Это был один из тех случаев, когда я настраивал почти все настройки, которые мог найти, поэтому трудно сказать, что именно, что не так, и что именно исправило это. 

Я думаю, что может помогли в следующем:

  • Преобразованная сборка для использования рабочей области и схемы Xcode (вместо проекта и цели)
  • Перегруппированная рабочая область, чтобы проект App и статическая библиотека были в качестве братьев и сестер (а не родитель/потомок)
  • Изменены настройки Xcode и рабочей области для использования местоположений сборки, указанных в целях
  • Измените путь продуктов сборки для приложения и библиотеки, чтобы использовать ../build (оба файла проекта содержатся в дочерних подпапках главного каталога, поэтому их встраивание в одну папку решило проблему с исходной командой linker/Ld, я думаю,)
  • Отредактировал схему приложения, чтобы явно создать цель библиотеки и построить ее до цели приложения
  • На этапах «Сборка» для цели приложения явным образом добавьте библиотеку в разделе «Связать двоичные файлы с библиотеками».
  • Измените тип расположения ссылки файла .a библиотеки на «Относительно продуктов сборки».
  • Добавлен этап сборки «Копировать заголовки» в проект библиотеки, добавлены соответствующие заголовки в публичный раздел
  • Изменен путь к папке публичных заголовков проекта библиотеки на «/ include»
  • Изменил каталог установки библиотеки на $(BUILT_PRODUCTS_DIR)
  • Изменены пути поиска в библиотеке и пути поиска по заголовку пользователя для цели приложения на $(BUILT_PRODUCTS_DIR) (рекурсивный)
  • Добавлена ​​команда Clean перед сборкой на моем сервере сборки Jenkins
  • Добавлены явные аргументы SDK и Arch в команду сборки
  • Удалены пробелы из имени конфигурации сборки

Окончательная сборка выглядит так:

xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -Arch "armv6 armv7"

Некоторые полезные ресурсы, которые я использовал при отладке этой проблемы:

Во всяком случае, я надеюсь, что у меня появилось достаточно ключевых слов, чтобы любой, кто столкнется с подобными проблемами в будущем, наткнулся на это и счел это полезным. Я понятия не имею, как рабочий процесс, который я делал много раз в Xcode 3.x, настолько испортился, когда я перешел на Xcode 4, и надеюсь, что Apple сможет исправить это в будущих выпусках.

Это был чертовски полезный опыт для меня, и прохождение всего этого, казалось, помогло решить проблемы с автозаполнением, которое у меня было заранее. Я скажу, что все могло быть намного хуже; Я все еще мог бы разрабатывать для SharePoint.

42
James J

Я столкнулся с той же проблемой вчера и смог решить ее. Стремясь сузить дело до Джеймса, я укажу на то, что мне нужно было сделать. Мне пришлось добавить рабочее пространство и перейти к запуску xcodebuild с рабочим пространством/схемой вместо проекта/цели. 

Использование рабочей области/схемы вынудило xcodebuild использовать папку DerivedData вместо папки вывода сборки основного проекта. Это позволило компоновщику найти связанную статическую библиотеку.

Этот пост был чрезвычайно полезен:

http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/

10
bromanko

Я получил эту ошибку, когда экспериментировал с моими файлами, я добавил @implementation в файл .h и оставил файл .m пустым. Я не верю, что это ваша ошибка, но если кто-то еще поймет это, возможно, убедитесь, что вы этого не сделали.

4
Popeye

Проверьте, не импортировали ли вы файлы .m в заголовочные файлы! Изменение .m на .h исправило это для меня!

2
nemesis

Я не знаю, будет ли это работать для вас, но в моем случае у меня было более одного файла main.m. Все, что мне нужно было сделать, это отсоединить один из main.m от цели, и это сработало. Убедитесь, что в вашем проекте не более одного main.m.

2
uneakharsh

Если вы посмотрите журнал сборки, в котором просят просмотреть все сообщения, вы увидите краткую строку с надписью «ссылка ...», в которой мало деталей. Однако, если вы щелкнете правой кнопкой мыши по этой строке и выберете «развернуть все стенограммы», вы получите очень подробную строку, сообщающую, какая команда была введена из XCode. 

Это должно помочь вам отладить проблему.

Дейв

1
Dave Stampf

У меня было похожее исключение: Оказалось, что я получил некоторую (нулевую) ссылку в project.pbxproj После того, как я очистил эту нулевую ссылку в project.pbxproj, сборка командной строки прошла так же, как xcode ранее делает . Взгляните на проект Xcode 4: утилита для очистки файла pbxproj? Грузопассажирских к очистке повышающего pbxproj-файл

для большей справки

1
laiBilly

Я решил проблему, выбрав «Путь поиска в библиотеке», и убедился, что все записи верны.

0
Paul

Внезапно у меня возникла та же проблема после Чистки, сначала я запаниковал, когда смотрел:

linker command failed with exit code 1 (use -v to see invocation)

... но это оказалось очень легко исправить, никакой командной строки не нужно!

Я нажал на корень моего проекта (тот, что вверху со значком чертежа с буквой «А») в Навигаторе, затем щелкнул раздел «ПРОЕКТ» (вы также можете щелкнуть раздел «ЦЕЛЬ»), а затем нажал кнопку внизу -средня называется "Проверить настройки".

Сам XCode проверил файлы проекта и сказал мне, что проблема была в дублировании определения цели, и предложил исправить это ... и вуаля, проблема исчезла!

Удачи!

0
Oscar Salguero

Лично у меня была эта проблема, когда я разрабатывал static library. У меня была цель static library со всем рабочим кодом и цель тестирования, которая использовала файл MyStaticLib.a в качестве фреймворка.

Тесты в Xcode выполнялись нормально, но не в терминале с использованием xcodebuild. В итоге проблема заключалась в том, что цель static library компилировалась для Standard architectures, а цель теста хотела компилировать для Standard architectures (including 64-bit). Переключение цели теста на Standard architectures исправило все.

0
marklar