Контроль, какой файл заголовка проекта XCode будет включать
-
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):
Добавьте пользовательскую настройку сборки USE_HEADMAP = NO для каждой заинтересованной цели. Вот как:
1.1. Откройте информационную панель цели на панели «Построить».
1.2. Установите всплывающее меню действий в левом нижнем углу окна, выберите «Добавить пользовательскую настройку».
1.3. В недавно добавленной строке установите первый столбец («настройка»), чтобыUSE_HEADERMAP
, и второй столбец («значение») кNO
.Добавьте правильный путь к каждому направлению (настройки целевых настроек создания »Пути поиска«). В моем примере это было бы:
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} / **