Успешная сборка Xcode 4, сборка командной строки завершается с ошибкой?
У меня есть проект в Xcode 4 (последняя не-бета-версия), которая строит отлично, когда встроена в сам Xcode. В частности, команда Ld правильно использует каталог производных данных (где размещаются продукты сборки, включая зависимую статическую библиотеку).
Однако, когда я строю один и тот же проект из командной строки, команда Ld терпит неудачу, поскольку она пытается использовать папку /build внутри проекта, которая не заполняется.
Я попытался настроить каждый параметр сборки, о котором я знаю, как в родительском, так и зависимом проекте.
Любые идеи о том, с чего начать эту отладку? Я могу предоставить дополнительную информацию по мере необходимости.
Редактировать 1: Полная команда сборки Xcode:
xcodebuild -project AppName.xcodeproj -target AppName -configuration "Config Name"
Где AppName
и Config Name
являются правильными значениями для сборки.
Изменить 2: Ссылки (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
Ответы
Ответ 1
Хорошо, так что почти 6 (оплачиваемых) часов спустя, я получил правильную работу сборки в Xcode и в командной строке (и на сервере сборки - все это упражнение).
По пути я бы исправил одну проблему только для того, чтобы вызвать другую - я бы, по-видимому, исправил проблему компоновщика /Ld, только чтобы вызвать проблемы в компиляции ( "SomeClass uneclared (сначала использовать в этой функции)" или "SomeHeader.h: Ошибок такого файла или каталога не было.)
Это было одно из тех случаев, когда я скорректировал почти все настройки, которые я мог найти, поэтому трудно сказать, что именно, что неправильно и что именно исправлено.
Вещи, которые, я думаю, могли бы помочь, заключаются в следующем:
- Преобразованная сборка для использования рабочего пространства и схемы Xcode (вместо проекта и цели).
- Перестроенное рабочее пространство, чтобы проект приложения и статическая библиотека были родными (не как родительские/дочерние).
- Изменены параметры Xcode и рабочей области для использования мест размещения, указанных в целевых объектах.
- Изменить путь к продуктам для приложения и библиотеки для использования. /build (оба файла проекта содержатся в подпапках sibling основного каталога, поэтому, если они встраиваются в одну папку, решаются исходные проблемы с компоновщиком /Ld, я думаю )
- Отредактирована схема приложения для явного создания цели библиотеки и ее создания до назначения приложения
- На этапе построения фаз для приложения явным образом добавьте библиотеку в разделе "Связывание с библиотеками"
- Измените тип местоположения библиотеки. Ссылка на файл "Относительно сборки продуктов"
- Добавлена фаза сборки "Копирование заголовков" в проект "Библиотека", добавлены соответствующие заголовки в раздел "Общие".
- Изменен путь папки общих заголовков библиотеки проекта к "/include"
- Изменен каталог установки библиотеки
$(BUILT_PRODUCTS_DIR)
- Изменены пути поиска библиотеки и пути поиска заголовка пользователя целевой точки приложения к
$(BUILT_PRODUCTS_DIR)
(рекурсивный)
- Добавлена команда Clean перед сборкой на моем сервере сборки Jenkins.
- Добавлены явные аргументы SDK и Arch в команду сборки
- Удаленные пробелы из имени конфигурации сборки
Команда Final build выглядит следующим образом:
xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -arch "armv6 armv7"
Некоторые полезные ресурсы, которые я использовал при отладке этой проблемы:
В любом случае, я надеюсь, что я набрал достаточное количество ключевых слов, чтобы кто-нибудь, у кого есть подобные проблемы сборки, в будущем натыкается на это и считает его полезным. Я не знаю, как много раз я делал много раз в Xcode 3.x, когда перешел на Xcode 4, надеясь, что Apple сможет очистить его в будущих выпусках.
Это было чертову опыта обучения для меня, и, проходя через все это, похоже, я выяснял проблемы с автозаполнением, которое я имел заранее. Я скажу, что все могло быть намного хуже; Я все еще мог развиваться для SharePoint.
Ответ 2
Вчера я столкнулся с тем же вопросом и смог его обработать. Стремясь сузить то, что сработало для Джеймса, я укажу, что я должен был сделать. Мне пришлось добавить рабочую область и переключиться на запуск xcodebuild с помощью рабочей области/схемы вместо проекта/цели.
Использование рабочей области/схемы вынуждает xcodebuild использовать папку DerivedData вместо папки вывода сборки в основном проекте. Это позволило компоновщику найти связанную статическую библиотеку.
Это сообщение в блоге было чрезвычайно полезно:
http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/
Ответ 3
Я получил эту ошибку, когда экспериментировал с моими файлами. Я добавляю @implementation в файл .h и оставляю файл .m пустым. Я не верю, что это ваша ошибка, но если кто-то еще получит ее, возможно, проверьте, что вы этого не сделали.
Ответ 4
Проверьте, не импортировали ли файлы .m в файлы заголовков! Изменение .m на .h исправило это для меня!
Ответ 5
Я не знаю, будет ли это работать для вас, но в моем случае у меня было более одного файла main.m
. Все, что мне нужно было сделать, это отсоединить один из main.m
от цели, и это сработало. Убедитесь, что в вашем проекте не более одного main.m
.
Ответ 6
Если вы посмотрите на журнал сборки, попросив увидеть все сообщения, вы должны увидеть краткую строку с надписью "link...", которая мало что может описать. Однако, если вы щелкните правой кнопкой мыши по этой строке и выберите "expand all transcripts", вы получите очень подробную строку, рассказывающую вам, какая команда была выпущена из XCode.
Это должно помочь вам отладить проблему.
Dave
Ответ 7
У меня возникло подобное исключение,
оказалось, что я получил некоторую (нулевую) ссылку в project.pbxproj
после того, как я очистил эту нулевую ссылку в проекте project.pbxproj, сборка командной строки была успешной, как и ранее выполнял xcode.
Взгляните на проект Xcode 4: утилита для очистки файла pbxproj?
утилита к очистке повышающего pbxproj файл
для дополнительной справки
Ответ 8
Внезапно у меня была такая же проблема после чистки, сначала я запаниковал вэнь, я смотрел:
linker command failed with exit code 1 (use -v to see invocation)
... но это оказалось очень легко исправить, не нужна командная строка!
Я нажал на свой корень проекта (тот, что сверху с иконкой чертежа с "A" ) в Навигаторе, затем щелкнул раздел PROJECT (вы также можете нажать раздел TARGET), а затем щелкнуть по кнопке в нижней части под названием "Подтвердить настройки".
XCode сам подтвердил файлы проекта и сказал мне, что проблема была дублированным целевым определением и предложила исправить ее... и voilá, проблема в ее исчезновении!
Удачи!
Ответ 9
Я разрешаю проблему, перейдя в "путь поиска библиотеки" и убедитесь, что все записи верны.
Ответ 10
Лично у меня была эта проблема, когда я разрабатывал static library
. У меня была цель static library
со всем производственным кодом и тестовой целью, которая вытащила файл MyStaticLib.a
в качестве рамки.
Тесты выполнялись отлично в Xcode, но не в терминале, используя xcodebuild
. Проблема заключалась в том, что цель static library
составляла компиляцию для Standard architectures
, в то время как целевая аудитория хотела скомпилировать для Standard architectures (including 64-bit)
. Переключение тестовой цели на Standard architectures
исправлено.