Как мне управлять зависимостями между проектами в рабочей области Xcode?

Я работаю над проектом приложения iOS и добавляю проект json-framework в рабочую область. Навигатор проекта слева показывает оба проекта, а селектор схемы сборки также показывает схемы обоих проектов. Теперь я хочу добавить цель libjson.a из проекта json-framework как зависимость от цели приложения iOS в другом проекте. Ожидаемый результат заключается в том, что всякий раз, когда создается цель приложения, он строит (при необходимости) целевую библиотеку и связывает цель приложения с ней. Вот как я пытался это сделать:

  • Постройте как часть одной и той же схемы. Способ, которым я пытаюсь это сделать, - отредактировать схему для моего приложения, добавив "libjson.a" в часть "Build" схемы, и, кстати, проверяется "Найти неявные зависимости". Затем я перехожу к целевому редактору для своей целевой задачи, а в "Build Phases" → "Link Binary With Libraries", я выбираю "libjson.a" из списка библиотек рабочих пространств. Когда я потом пытаюсь построить схему, я вижу, что она создает целевую библиотеку, но создание целевой задачи приложения не выполняется с ошибкой компоновщика "Библиотека не найдена для -ljson" - предполагая, что она фактически не обнаружила, что библиотека была построена. Действительно, в навигаторе проекта запись в проекте приложения для библиотеки по-прежнему красная, что означает, что файл не существует.

  • Добавить json target как явную зависимость. Чтобы попробовать это, я не изменяю схему сборки, но перейдите в целевой редактор для своей целевой задачи и нажмите кнопку "Добавить" в разделе "Зависимости целей". Не отображаются цели из других проектов в рабочей области, поэтому это не стартер.

  • Перетащите проект JSON в другой проект, затем добавьте цель как зависимость. Это то, что я бы сделал в Xcode 3. В навигаторе проекта я захватил проект библиотеки и перетащил его поверх проекта приложения. Это вызывает обычную панель "Добавить файлы", которую я просто уволил, нажав "Готово". Теперь есть два элемента для проекта библиотеки в навигаторе проекта: один на верхнем уровне и один под проектом приложения. Теперь я могу добавить целевую библиотеку в качестве зависимости целевой цели приложения с помощью целевого редактора и не связываться с ней без ошибок на фазе библиотек ссылок. Но он выглядит сломанным: в навигаторе есть несколько записей для одного и того же проекта. Есть ли другой способ сделать это?

Что следует рассматривать как способ Xcode 4-ish для подключения этих целей в разных проектах в одном рабочем пространстве? Казалось бы, нет, если несколько проектов в одном и том же рабочем пространстве не могут фактически взаимодействовать друг с другом. Благодаря, Graham.

Ответ 1

Я просто установил тестовый проект, в значительной степени, как вы описываете в версии 3, создав новое рабочее пространство и перетащив в него два проекта Xcode, вложенные, как показано.

Вы можете удалить проект sibling, если он у вас уже есть.

Нажатие на него строится, и это просто работает, насколько я могу видеть.

Scheme SettingsProject Layout

Я предполагаю, что существует внутренняя путаница пути, если у вас есть два проекта, и Id будет склонен возиться с настройками местоположения в "View" → "Utilities" → "File Inspector" и посмотреть, какой эффект имеет.

enter image description hereenter image description here

Еще одна вещь, которую нужно попробовать, - установить ваши пути в Xcode "Предпочтения..." → "Деревья источника" и ссылаться на них таким образом, как описано здесь: Легкий, модульный обмен кодами через iPhone Apps: статические библиотеки и межсайтовые ссылки

НТН. Энди У.

Ответ 2

Мне удалось получить зависимости между проектами в рабочей области, чтобы работать, как я описал здесь: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/.

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

Ответ 3

Я собирался задать тот же вопрос, считая, что мое собственное решение не может быть правильным. Но я не вижу здесь упоминания, и это похоже на работу. Очевидно, что XCode 4 - это работа.:)

У меня есть рабочее пространство с двумя проектами: статическая библиотека и приложение, которое использует библиотеку. Проекты - братья и сестры. Каждый проект имеет свою собственную схему, и каждая схема настроена только для создания одной цели. Другими словами, я добавил два проекта в рабочую область и что это.

Чтобы добавить статическую библиотеку в зависимость от приложения, я просто перетаскиваю продукт libsomething.a из проекта библиотеки (Project Navigator) в список "Ссылка с бинарными библиотеками" для целевой страницы приложения. Это. Теперь, когда я создаю приложение, проект библиотеки сначала создается, а затем связан. Интересно, что когда я изменяю схему приложения для использования другой конфигурации (например, Release вместо Debug), библиотека создается с использованием той же конфигурации.

Итак, это работает, и, очевидно, здесь происходит автоматическая проверка зависимостей. Но это неправильно. Опять же, так же, как редактор/менеджер модальной схемы и отсутствие объекта рабочей области в навигаторе проекта... Я никогда не думал, что я это скажу, но интерфейс Visual Studio (bleh) намного яснее.

Ответ 4

Мое пуленепробиваемое решение для этого:

Создайте в настройках сборки в главном проекте (а не в библиотеке) настройки "На отладку-выпуск/на архитектуру", чтобы включить либо .. /MyLibProject/build/Debug -iphoneos или .. /MyLibProject/build/Release -iphonesimulator или и т.д..
в зависимости от конфигурации (вы можете создать такую ​​конфигурацию, щелкнув по кнопке + рядом с Debug или Release и выбрав либо "Any IOS Simulator SDK", либо "любой SDK для iOS". Вы должны сделать это как для "пути поиска заголовка" (если ваша библиотека скопирует некоторые файлы заголовков, что более чем вероятно) И для "Пути поиска библиотеки". Это означает, что для каждой настройки вы, вероятно, будете иметь 4 разных пути (отладочный sim, debug ios, release sim, release ios). Это обеспечит соответствие конфигурации обоих проектов.

Теперь, чтобы автоматически скомпилировать lib, то есть создать зависимость, вы можете использовать "Build Phase → Link to Binary With Libraries → + → выбрать совет .a file", приведенный выше.

Это единственный способ, которым мне удалось создать что-то, что правильно строит и правильно связывает для каждой среды на xcode 4.5

Примечание. Я даже добавил флаг -lmyLib в "другие флаги компоновщика", но я не уверен, что действительно необходимо

Ответ 6

Я вижу следующие варианты:

  1. Explicit dependency в проекте[About]
  2. Implicit dependency в рабочем пространстве[About]

Ответ 7

См. руководство пользователя Xcode: Xcode Concepts → Рабочее пространство Xcode в разделе "Проекты в рабочей области. Поделитесь каталогом сборки".

Все проекты в одном рабочем пространстве совместно используют каталог сборки. Зависимости обнаруживаются автоматически и строятся, если необходимо:

"Xcode проверяет файлы в каталоге сборки для обнаружения неявных зависимостей. Например, если один проект, включенный в рабочую область, создает библиотеку, связанную с другим проектом в одном и том же рабочем пространстве, Xcode автоматически создает библиотеку перед созданием другой проект, даже если конфигурация сборки не делает эту зависимость явной. При необходимости вы можете переопределить такие неявные зависимости с явными настройками сборки. Для явных зависимостей вы должны создавать ссылки на проект.