Как я должен управлять зависимостями между проектами в рабочей области XCode?
Я работаю над проектом приложения для iOS и добавляю проект json-framework в рабочую область. Навигатор проектов слева отображает оба проекта, а селектор схем сборки также показывает схемы обоих проектов. Теперь я хочу добавить цель libjson.a из проекта json-framework в качестве зависимости от цели приложения iOS в другом проекте. Ожидаемый результат заключается в том, что всякий раз, когда создается цель приложения, она создает (при необходимости) цель библиотеки и связывает цель приложения с ней. Вот способы, которые я пытался сделать это:
Сборка как часть одной схемы. Я пытаюсь это сделать, отредактировав схему для своего приложения, добавив libjson.a в часть схемы Build, и, таким образом, проверяется "Найти неявные зависимости". Затем я перехожу к редактору целей для цели моего приложения и в "Фазах сборки"->"Связать двоичные файлы с библиотеками" выбираю "libjson.a" из списка библиотек рабочей области. Когда я впоследствии пытаюсь построить схему, я вижу, что она строит цель библиотеки, но создание цели приложения завершается ошибкой с ошибкой компоновщика "Библиотека не найдена для -ljson", что указывает на то, что она фактически не обнаружила, что библиотека была построена. Действительно, в навигаторе проекта запись в проекте приложения для библиотеки по-прежнему красная, что указывает на то, что файл не существует.
Добавьте цель json как явную зависимость. Чтобы попробовать это, я не изменяю схему сборки, но захожу в целевой редактор для цели моего приложения и нажимаю кнопку добавления в разделе "Целевые зависимости". Никакие цели из других проектов в рабочей области не отображаются, так что это не стартер.
Перетащите проект JSON в другой проект, затем добавьте цель в качестве зависимости. Это то, что я сделал бы в Xcode 3. В навигаторе проекта я беру проект библиотеки и перетаскиваю его поверх проекта приложения. Это вызывает обычную панель "Добавить файлы", которую я просто закрываю, нажимая "Готово". Теперь в навигаторе проекта есть две записи для проекта библиотеки: одна на верхнем уровне, а другая в проекте приложения. Теперь я могу добавить цель библиотеки как зависимость цели приложения, используя редактор целей, и могу ссылаться на нее без ошибок на этапе создания библиотеки ссылок. Но это выглядит неработоспособно: в навигаторе есть несколько записей для одного и того же проекта. Есть ли другой способ сделать это?
Что следует считать способом "Xcode 4-ish" для соединения этих целей в разных проектах в одной рабочей области? Казалось бы, не хватает, если несколько проектов в одной рабочей области не могут взаимодействовать друг с другом. Спасибо, Грэм.
6 ответов
Я только что создал тестовый проект, в значительной степени, как вы описали в версии 3, создав новое рабочее пространство и перетащив в него два проекта XCode, вложенные, как показано на рисунке.
Вы можете удалить одноуровневый проект, если он у вас уже есть.
Нажав на это, и это работает, насколько я вижу.
Я полагаю, что если у вас есть два проекта, существует путаница с внутренним путём, и я был бы склонен возиться с настройками местоположения в "Вид"->"Утилиты"->"Инспектор файлов" и посмотреть, какой эффект это имеет.
Еще одна вещь, которую нужно попробовать, - это настроить ваши пути в Xcode "Preferences…"->"Source Trees" и ссылаться на них таким образом, как описано здесь: Простой, модульный обмен кодом через приложения iPhone: статические библиотеки и межпроектные ссылки
НТН. Энди В.
Мне удалось получить зависимости между проектами в рабочей области для работы, как я описал здесь: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/.
К сожалению, я не могу найти способ заставить XCode обнаружить неявные зависимости или проиндексировать все в сборке, как рекламируется. Я нашел обходной путь к обоим, но я надеюсь, что по мере развития Xcode 4 потребуется меньше ручной настройки.
Я собирался задать тот же вопрос, думая, что мое собственное решение не может быть правильным. Но я не вижу, чтобы это упоминалось здесь, и это, кажется, работает. Очевидно, что XCode 4 находится в стадии разработки.:)
У меня есть рабочее пространство с двумя проектами: статическая библиотека и приложение, которое использует библиотеку. Проекты братьев и сестер. Каждый проект имеет свою собственную схему, и каждая схема настроена только на создание одной цели. Другими словами, я добавил два проекта в рабочую область и все.
Чтобы добавить статическую библиотеку в качестве зависимости приложения, я просто перетаскиваю продукт libsomething.a из проекта библиотеки (Project Navigator) в список "Связать двоичные файлы с библиотеками" для цели приложения. Вот и все. Теперь, когда я создаю приложение, сначала создается библиотечный проект, а затем связывается. Интересно, что когда я изменяю схему приложения для использования другой конфигурации (например, Release вместо Debug), библиотека создается с использованием той же конфигурации.
Так что это работает, и здесь явно происходит некоторая автоматическая проверка зависимостей. Но это неправильно. Опять же, как и редактор / менеджер модальных схем и отсутствие объекта рабочего пространства в навигаторе проекта... Я никогда не думал, что скажу это, но пользовательский интерфейс Visual Studio (bleh) намного понятнее.
Мое пуленепробиваемое решение для этого:
Создайте настройки "Для каждого отладочного выпуска / для каждой архитектуры" в настройках сборки в главном проекте (не в библиотеке), чтобы включить либо../MyLibProject/build/Debug-iphoneos или../MyLibProject/build/Release-iphonesimulator или т. Д...
в зависимости от конфигурации (вы можете создать такую конфигурацию, нажав + рядом с "Отладка или выпуск" и выбрав "Any iOS Simulator SDK" или "любой iOS SDK". Это необходимо сделать как для "Пути поиска заголовка") (в случае, если ваша библиотека скопирует некоторые заголовочные файлы, что более чем вероятно) И для "Пути поиска в библиотеке". Это означает, что для каждого параметра вы, вероятно, в конечном итоге получите 4 различных пути (отладочная симуляция, отладка ios, выпуск sim, выпуск ios). Это обеспечит совпадение конфигурации обоих проектов.
Теперь, чтобы автоматически скомпилировать библиотеку, то есть создать зависимость, вы можете использовать совет "Build Phase -> Link to Binary With Libraries -> + -> select.a file", приведенный выше.
Это единственный способ, которым мне удалось получить что-то, что правильно собирает и связывает для каждой среды на xcode 4.5
Примечание: я даже добавил флаг -lmyLib в "другие флаги компоновщика", но я не уверен, что это действительно необходимо
Я добился определенного успеха в создании статических библиотек, подобных фреймворкам, хотя это не идеальное решение.
См. Руководство пользователя XCode: Концепции XCode -> Рабочая область XCode под 'Проектами в Рабочей области, Разделяют Каталог Сборки'.
Все проекты в одной рабочей области совместно используют каталог сборки. Зависимости обнаруживаются автоматически и при необходимости строятся:
"Xcode проверяет файлы в каталоге сборки, чтобы обнаружить неявные зависимости. Например, если один проект, включенный в рабочее пространство, создает библиотеку, с которой связан другой проект в том же рабочем пространстве, Xcode автоматически создает библиотеку перед созданием другого проекта, даже если конфигурация сборки не делает эту зависимость явной. Вы можете переопределить такие неявные зависимости явными настройками сборки, если это необходимо. Для явных зависимостей вы должны создать ссылки на проект."