управление, которое будет включать заголовочный файл проекта XCode

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

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

Вот моя файловая иерархия проекта (который копируется в 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 добавить ссылку на папку включения - также что-то, чего я избежал бы, потому что я должен был бы сделать это дважды с условной директивой компиляции.
- Я свободен настроить свой проект, поскольку я иначе считаю целесообразным

Спасибо за любую справку.

14
задан Jean-Denis Muys 8 April 2010 в 00:02
поделиться

2 ответа

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

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

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

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

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

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

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

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

22
ответ дан 1 December 2019 в 09:32
поделиться

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

0
ответ дан 1 December 2019 в 09:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: