Зависимости XCode в разных каталогах сборки? - PullRequest
4 голосов
/ 22 сентября 2009

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

Это существующий проект, в котором уже есть сборки Visual Studio и Makefile. Эти сборки помещают библиотеки в каталог lib / Debug , а исполняемые файлы - в bin / Debug . Поэтому в XCode я изменил путь продуктов сборки на «lib» и «bin» соответственно (так что мы можем использовать один набор документации для всех платформ). Это помещает скомпилированные цели в правильное место, но полностью нарушает как связывание (библиотека не найдена), так и зависимости.

Я могу исправить связывание, добавив $ (SRCROOT) / lib / Debug к путям поиска в библиотеке для каждого исполняемого файла (но создается впечатление, что XCode должен иметь возможность выяснить это самостоятельно, что заставляет меня думать, что я делаю что-то не так).

Но - я не могу понять, как заставить работать зависимости снова. Если я изменю исходный файл библиотеки, библиотека перестроит, но не зависимые исполняемые файлы. Если я форсирую сборку исполняемого кода XCode возвращает успех, ничего не делая; он думает, что цель актуальна. Если я уберу цель, а затем перестрою, она будет работать.

Итак, есть идеи? Является ли Xcode принципиально глупым в этом отношении, или это я (я склоняюсь к последнему)?

Обновление: Я опубликовал пример проекта для демонстрации проблемы на http://share.industriousone.com/XcodeDepsIssue.zip. Создайте его один раз, затем измените MyStaticLib.c и соберите его снова. Исполняемый файл не будет связан (и должен). Большое спасибо за любую помощь в этом.

Ответы [ 5 ]

2 голосов
/ 16 августа 2011

starkos, спасибо за публикацию вашего заключения. Это подтвердило и мой опыт. Эта ситуация меня сильно задела, поэтому было приятно узнать, что я что-то упустил.

Однако я обнаружил обходной путь, позволяющий избежать создания нескольких проектов или сохранения библиотеки и ее зависимостей в одном каталоге. Это взлом, но он работает здесь.

Я знаю, что немного поздно, но лучше, чем никогда.

Для библиотеки зависимостей добавьте «Фаза сборки копирования файлов» с Абсолютным путем в качестве места назначения, а текстовое поле пути должно быть каталогом, в котором находится целевой объект DEPENDENT. Затем нажмите «Продукты», найдите библиотеку зависимостей (оканчивается на .a) и перетащите ее в «Фазу сборки файлов копирования». Если вы сейчас выполните сборку, это поместит библиотеку в ее собственный каталог, как и прежде, и ТОГДА также скопирует ее в целевой каталог зависимого устройства.

Теперь для зависимого вы можете удалить выходной каталог зависимости из путей поиска библиотеки. Это заставит его найти копию библиотеки. Если вы сделаете это, зависимый действительно будет перепривязан каждый раз, когда переопределяется зависимость .a.

Минусами, конечно же, являются дополнительное время для копирования и необходимость указывать (на этапе копирования) целевой каталог для каждого зависимого от вашей библиотеки. Хотя, черт побери, из альтернатив ...

1 голос
/ 30 мая 2012

Вот мое решение для этого странного поведения в xcode 4.3.1. В схему нужно добавить предварительное действие сборки:

rm -f ${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}

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

ПРИМЕЧАНИЕ. Попытка поместить этот сценарий в фазу сборки проекта, и результат был отрицательным - отладчик не смог подключить процесс для начала отладки.

Удачи!

1 голос
/ 17 августа 2010

Я исследовал это еще немного, и ответ - нет, Xcode 3.x не отслеживает зависимости между целями, которые живут в разных каталогах. Вы можете обойти это, предоставив каждой библиотеке свой собственный проект и добавив каждый из них в главный проект. Или вы можете хранить все свои цели в одном каталоге. Выбери свой яд.

1 голос
/ 22 сентября 2009

Xcode не устанавливает автоматически зависимости, основанные на использовании продуктов сборки; Вы должны установить явные целевые зависимости самостоятельно.

Проект> Изменить настройки цели, вкладка Общие, кнопка +, добавить любые цели, которые являются предпосылками для построения выбранной цели. Это должно привести вас в порядок.

0 голосов
/ 22 сентября 2009

ОК, было бы полезно иметь текст строки сборки Linking ..., которая не работает. Но пара вещей:

1) Вы не должны ссылаться ни на что в $ (SRCROOT). Это источники вашего проекта. Есть два места, где можно найти ссылки: $ (SYMROOT) (каталог продуктов сборки) или $ (DSTROOT) (каталог установленных продуктов).

Одна вещь, которую вы могли бы сделать - это иметь общий каталог сборки, а затем использовать действие «xcodebuild install» для установки продуктов в каталог установки. Другой - использовать фазу сборки «Копировать файлы», чтобы скопировать их после сборки, чтобы вы могли ссылаться на них в $ (SYMROOT), но при этом иметь их там, где их ожидают соотечественники Windows.

Вероятно, это способ правильно настроить каталоги продуктов сборки для каждой цели, но мне действительно нужно увидеть сам проект, чтобы понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...