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

StackOverflow https://stackoverflow.com/questions/2596695

  •  25-09-2019
  •  | 
  •  

Вопрос

Мой проект 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 должно быть, как показано. Оба последующего FAIL с файлом не найден ошибка:

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

Так есть ли способ сказать xcode, который theirLib.h включить за цель?

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

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

Это было полезно?

Решение

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

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

  1. Добавьте пользовательскую настройку сборки USE_HEADMAP = 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, насколько я могу сказать. Я заполню отчет об ошибке для этого, поскольку этот параметр имеет решающее значение в ряде случаев, как раскрывается глупость. Сообщается как RDAR: // 7840694. Также на открытом радаре, как http://openradar.appspot.com/radar?id=253401.

Другие советы

USE_HEADMAP = нет - это сверхугольник для некоторых проектов. Может быть достаточно, чтобы просто использовать headermap_includes_flat_entriets_for_target_being_built = no. Документация здесь: https://developer.apple.com/library/mac/documentation/develyertools/reference/xcodeBuildSettingRef/1-build_setting_reference/build_setting_ref.html#//apple_ref/doc/uid/tp40003931-Ch3-SW159.

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

Используйте use_headermap = no и in "Путей поиска заголовков пользователей" включают в себя свой подобный каталог каталога на пользовательский каталог рекурсивно вторые: $ {project_dir} / imynewlib $ {project_dir} / **

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top