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

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

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

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

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

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


person Community    schedule 30.03.2011    source источник


Ответы (7)


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

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

Нажимаю build on this и это просто работает, насколько я вижу.

Настройки схемыМакет проекта

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

введите здесь описание изображениявведите здесь описание изображения

Еще одна вещь, которую можно попробовать, — настроить свои пути в Xcode «Предпочтения…» -> «Исходные деревья» и ссылаться на них таким образом, как описано здесь: Простое модульное совместное использование кода в приложениях для iPhone: статические библиотеки и межпроектные ссылки

ХТН. Энди В.

person creednmd    schedule 30.03.2011
comment
Я надеюсь, что это работает на обеих наших машинах! :) Я видел, что точно такая же установка не работает, что я приписал общей ненадежности Xcode 4. - person creednmd; 31.03.2011
comment
У меня были те же проблемы, и я исправил их, отредактировав схему и отключив парализованные сборки как для сборки, так и для архива. Это решило проблему для меня. - person Mark Lilback; 03.07.2011
comment
какой смысл в рабочем пространстве Xcode 4, если вам все равно нужно использовать подпроект? - person Tony; 04.01.2012
comment
Рабочие области полезны для группировки связанных материалов вместе. Делает создание целей, обработку подпроектов, пути сборки библиотек и схемы более удобными. Это больше касается организации, чем чего-либо еще, поэтому вы можете увидеть выгоду или нет, в зависимости от того, как вы работаете. - person creednmd; 07.01.2012
comment
фактическая ссылка на сообщение в блоге: blog.sina.com.cn/s/blog_79a2178d0100ypfn.html< /а> - person joliejuly; 24.11.2020

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

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

person Jonah    schedule 04.04.2011
comment
Великолепная запись в блоге! Мне очень помог! +1 - person leviathan; 03.08.2011
comment
В версии 4.2 процесс был почти безупречен при очень сложной настройке проекта (множество подпроектов библиотек и приложений, содержащих одну или две цели). Единственное, что не сработало с места в карьер, это ссылки. Мне пришлось добавить $(BUILD_ROOT)/$(CONFIGURATION) в путь поиска библиотеки, чтобы можно было найти все продукты из родственных проектов библиотеки. Ваш раздел «Добавление заголовков статической библиотеки» указал мне правильное направление. Спасибо! - person Steven Kramer; 12.12.2011

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

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

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

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

person Tyler Daniel    schedule 21.04.2011

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

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

Теперь, чтобы автоматически скомпилировать библиотеку, то есть создать зависимость, вы можете использовать приведенный выше совет «Фаза сборки -> Ссылка на двоичный файл с библиотеками -> + -> выберите файл .a».

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

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

person Ben G    schedule 22.01.2013

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

person amrox    schedule 25.09.2011

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

  1. Explicit dependency в проекте[О программе]
  2. Implicit dependency в рабочей области[О программе]
person yoAlex5    schedule 29.08.2019

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

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

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

person Joris Kluivers    schedule 30.03.2011
comment
Мой вопрос уже указывает на то, что этот подход не работает. - person ; 30.03.2011
comment
У меня это работало таким образом, но в новом рабочем пространстве, которое я создал с двумя проектами, это больше не работает. Я все еще думаю, что это «Xcode 4-ish» для работы с зависимостями (это то, о чем вы просили), ошибки, вероятно, просто мешают правильной работе метода. Кажется, единственный способ сделать это сейчас - уродливая техника. - person Joris Kluivers; 30.03.2011
comment
Сотрите мой последний комментарий, неявные зависимости, кажется, работают. Я создал тестовую рабочую область + два проекта (библиотека + приложение с использованием библиотеки). Сборка приложения автоматически создаст библиотеку. Проект был создан аналогично первому пункту. Клонируйте код по адресу: bitbucket.org/kluivers/dependencies-demo. - person Joris Kluivers; 30.03.2011
comment
Иногда они делают, иногда нет. Ваш проект работает на меня. Но я создал (в XCode 4) почти идентичный, который не работает (или, по крайней мере, непоследовательно: первая сборка после очистки обычно в порядке, но последующие сборки не перестраивают библиотеку, чтобы отразить новые изменения) ). - person Cris; 04.04.2011
comment
Это будет работать каждый раз, но только если вы внесете исправление в свой проект, требующее редактирования файла .pbxproj напрямую. Я использую эту технику, и я не уверен, что это действительно стоит того. - person Steven Fisher; 31.10.2012