контроль, какой заголовочный файл проекта будет включать Xcode - PullRequest
14 голосов
/ 08 апреля 2010

Мой проект XCode строится для вариаций одного и того же продукта с использованием двух целей. Разница между ними заключается только в том, какая версия включенной библиотеки используется. Для исходных файлов .c легко назначить правильную версию для правильной цели, используя флажок target. Тем не менее, включение заголовочного файла всегда включает один и тот же. Это верно для одной цели, но неправильно для другой.

Есть ли способ контролировать, какой заголовочный файл включается каждой целью?

Вот моя иерархия файлов проекта (которая реплицируется в Xcode):

MyProject
  TheirOldLib
    theirLib.h
    theirLib.cpp
  TheirNewLib
    theirLib.h
    theirLib.cpp
myCode.cpp

и myCode.cpp делает такие вещи как:

#include "theirLib.h"
…
somecode()
{
#if OLDVERSION
  theirOldLibCall(…);
#else
  theirNewLibCall(…);
#endif
}

И, конечно, я определяю OLDVERSION для одной цели, а не для другой.

Обратите внимание, что #include должно быть таким, как показано. Оба следующих сбоя с файлом не найдена ошибка:

#include "TheirOldLib/theirLib.h"
#include "TheirNewLib/theirLib.h"

Так есть ли способ сообщить Xcode, какой theirLib.h включить для цели?

Ограничения:
- два заголовочных файла имеют одинаковое имя. В крайнем случае, я мог бы переименовать одну из них, но я бы предпочел этого избегать, так как это приведет к сильному растяжению волос на других платформах.
- Я бы предпочел избегать изменения #include для добавления ссылки на вложенную папку, потому что мне нужно было бы сделать это дважды с помощью условной директивы компиляции.
- Я могу настроить свой проект так, как считаю нужным

Спасибо за любую помощь.

Ответы [ 4 ]

22 голосов
/ 08 апреля 2010

Ключевой частью ответа является использование USE_HEADERMAP = NO, как предложено Крисом в комментарии. Вот подробности.

Краткий рецепт (проверено в Xcode 3.2.2):

  1. добавить пользовательскую настройку сборки USE_HEADERMAP = NO для каждой заинтересованной цели. Вот как:
    1.1. Откройте информационную панель цели на панели «Построение».
    1.2. В раскрывающемся меню действий в левом нижнем углу окна выберите «Добавить пользовательскую настройку».
    1.3. В новой добавленной строке задайте для первого столбца («Настройка») USE_HEADERMAP, а для второго столбца («Значение») - NO.

  2. добавить правильный путь включения для каждой цели (целевые параметры сборки "Пути поиска по заголовку"). В моем примере это будет:
    2.1. добавьте TheirOldLib для "старой" цели
    2.2. добавьте TheirNewLib для "новой" цели

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

Шаг 2 позволяет #include "theirLib.h" работать без указания фактического пути к файлу заголовка.

Эти два шага вместе выполняют мои два ограничения.

Наконец, USE_HEADERMAP - это , а не , документированный Apple, насколько я могу судить. Для этого я напишу отчет об ошибке, так как этот параметр имеет решающее значение в ряде случаев, как показывает поиск в Google. Сообщается как rdar: // 7840694. Также на открытом радаре как http://openradar.appspot.com/radar?id=253401

7 голосов
/ 07 сентября 2011

USE_HEADERMAP = NO для некоторых проектов является излишним. Может быть достаточно просто использовать HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT = NO. Документация здесь: https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-SW159

0 голосов
/ 03 февраля 2019

Используйте USE_HEADERMAP = NO и в поле «Пути поиска по заголовкам пользователей» сначала укажите свой пользовательский каталог, а затем рекурсивно второй каталог проекта: $ {PROJECT_DIR} / OurNewLib $ {PROJECT_DIR} / **

0 голосов
/ 08 апреля 2010

Почему вы не можете просто использовать разные пути включения в каждой цели?

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