Как XCode обрабатывает операторы заголовка #import с несколькими целями? - PullRequest
2 голосов
/ 06 ноября 2010

У меня есть проект XCode с двумя целями (оба приложения для iPhone используют 95% одного и того же кода). Тем не менее, один модуль не является «разделяемым»; реализации слишком разные.

Мое решение (которое не работает) состояло в том, чтобы добавить 2 подкаталога в мою папку Classes/ в каталоге моего проекта - по одному для каждой цели. В каждом каталоге я поместил класс контроллера представления, названный ExampleSentencesViewController. Конечно, каждый файл скомпилирован как часть только одной цели - я ищу "автоматическое переключение" используемой реализации на основе цели.

В настройках каждой цели я добавил каждый каталог в настройку «Пути поиска по заголовкам» (каждый путь для каждой цели).

Как ни странно, он компилируется только для исходной цели. Цель, которую я добавил позже, не скомпилируется, утверждая, что я включил один и тот же заголовок дважды (если честно, есть два файла). Как заставить XCode забыть об оригинальном заголовке ??

Я пытался удалить файлы .h из моего проекта, но, похоже, это не помогло.

Любая помощь приветствуется.

1 Ответ

3 голосов
/ 06 ноября 2010

полностью определяют пути заголовков в отдельных файлах реализации на основе одного из определенных вами каталогов поиска:

#include <MONProject/Source/ExampleSentencesViewController.h>

против

#include <MONSecondProject/Source/ExampleSentencesViewController.h>

обновление на основе уточнения:

в идеале вы должны создать статическую библиотеку для общего кода.

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

/* you must define either MON_BUILD_MON_FIRST_PROJECT or MON_BUILD_MON_SECOND_PROJECT at the target level */

#if (defined(MON_BUILD_MON_FIRST_PROJECT) && defined(MON_BUILD_MON_SECOND_PROJECT))
#error invalid configuration: you cannot specify both projects to be compiled
#elif defined(MON_BUILD_MON_FIRST_PROJECT)
/* some fully qualified path: */
#include <MONFirstProject/ExampleSentencesViewController.h>
#elif defined(MON_BUILD_MON_SECOND_PROJECT)
/* some other fully qualified path: */
#include <MONSecondProject/ExampleSentencesViewController.h>
#else
#error uh... which project are you trying to build?
#endif

или вы можете просто использовать эти определения для условного включения /отключите интерфейс и реализацию классов с дублирующимися именами (а затем просто включите их оба в объявление проекта:

/* MONFirstProject/ExampleSentencesViewController.h> */

#if defined(MON_BUILD_MON_FIRST_PROJECT)
@interface ExampleSentencesViewController : NSViewController
/* ... */
@end
#endif

… но для этого потребуется включить оба заголовка в ваш дистрибутив (если применимо).

некоторые подробности включения могут отличаться в зависимости от того, как вы объявили свои пути поиска (например, рекурсивны они или нет?) И используете ли вы фазы сборки заголовков копирования в своем xcodepРож.поддержание обоих проектов с общим кодом может стать грязным, если вы слишком расслаблены в своих директивах включения, опциях обнаружения, объявлениях препроцессора (условная компиляция / видимость) и / или конфигурациях сборки, поэтому ... поэтому я рекомендую библиотеку для общегобиты.этот условный материал (в двух предыдущих примерах) подвержен ошибкам и плохо развивается или масштабируется.это также хороший способ запутать другие инструменты в наборе инструментов разработки.

На самом деле, я предпочитаю это перед препроцессором (при условии, что вы можете распределить оба класса):

- (UIViewController *)newViewControllerForMyAwesomeView {
    if (IsAppMONFirstProject) {
        return [[MONFirstProjectViewController alloc] init...];
    }
    else if (IsAppMONSecondProject) {
        return [[MONSecondProjectViewController alloc] init...];
    }
    else {
        assert(0 && "definitely break up your code, now that it is referenced by 3 or more projects");
        return 0;
    }
}

если вы просто поддерживаете две версии одного и того же заголовка, то практики будут сильно отличаться.

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

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