Как я должен управлять зависимостями между проектами в рабочем пространстве XCode? - PullRequest
58 голосов
/ 30 марта 2011

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

  • Создайте оба как часть одной и той же схемы.Я пытаюсь это сделать, чтобы отредактировать схему для моего приложения, добавив libjson.a в часть схемы Build, и, таким образом, проверяется «Найти неявные зависимости».Затем я перехожу к редактору целей для цели моего приложения и в «Фазах сборки» -> «Связать двоичные файлы с библиотеками» выбираю «libjson.a» из списка библиотек рабочей области.Когда я впоследствии пытаюсь построить схему, я вижу, что она строит цель библиотеки, но создание цели приложения завершается ошибкой с ошибкой компоновщика «Библиотека не найдена для -ljson», что указывает на то, что она фактически не обнаружила, что библиотека была построена.Действительно, в навигаторе проекта запись в проекте приложения для библиотеки все еще красная, что указывает на то, что файл не существует.

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

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

Что следует считать способом «Xcode 4-ish» для соединения этих целей в разных проектах в одной рабочей области?Казалось бы, не хватает, если несколько проектов в одной рабочей области не могут взаимодействовать друг с другом.Спасибо, Грэм.

Ответы [ 6 ]

23 голосов
/ 30 марта 2011

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

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

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

Scheme Settings Project Layout

Я представляюесли у вас есть два проекта, существует путаница с внутренним путём, и я был бы склонен возиться с настройками местоположения в «Вид» -> «Утилиты» -> «Инспектор файлов» и посмотреть, какой эффект это имеет.

enter image description here enter image description here

Другая вещь, которую нужно попробовать, - это установить свои пути в Xcode «Предпочтения ...» -> «Исходные деревья» и обращаться к ним таким образом, как описано здесь: ЛегкоМодульный обмен кодами в приложениях для iPhone: статические библиотеки и межпроектные ссылки

HTH.Энди У.

9 голосов
/ 04 апреля 2011

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

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

1 голос
/ 22 января 2013

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

Создайте настройки «Для каждого отладочного выпуска / для архитектуры» в Настройках сборки в главном проекте (не в библиотеке), чтобы включить либо ../MyLibProject/build / Debug-iphoneos или ../MyLibProject/build/Release-iphonesimulator или т. д.
в зависимости от конфигурации (вы можете создать такую ​​конфигурацию, нажав + рядом с «Отладка или выпуск» и выбрав «Любой»iOS Simulator SDK "или" любой iOS SDK ". Это необходимо сделать как для" Пути поиска заголовка "(в случае, если ваша библиотека скопирует некоторые файлы заголовков, что более вероятно), так и для" Пути поиска библиотеки ". Это означает, чтодля каждого параметра вы, вероятно, в конечном итоге получите 4 разных пути (отладочная сим, отладка ios, выпуск сим, выпуск ios). Это обеспечит совпадение конфигурации обоих проектов.

Теперь для автоматического-компилировать библиотеку, то есть для создания зависимости, вы можете использовать совет «Build Phase -> Link to Binary With Libraries -> + -> select .a file», данный above.

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

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

1 голос
/ 21 апреля 2011

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

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

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

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

0 голосов
/ 25 сентября 2011

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

0 голосов
/ 30 марта 2011

См. Руководство пользователя Xcode: Основные понятия Xcode -> Рабочая область Xcode в разделе «Проекты в рабочей области. Общий доступ к каталогу сборки».

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

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

...