Расположение карты модуля и настройки компилятора со смешанными средами Objective-C / Swift - PullRequest
2 голосов
/ 17 мая 2019

Справочная информация: я конвертирую большую старую смешанную кодовую базу в каркас. У меня проблемы, поэтому я решил начать с минимального тестового проекта, чтобы увидеть, как все работает. Я столкнулся с большим количеством проблем. Это Swift 5.0 с Xcode 10.2.1.

Я создал новый проект iOS-фреймворка под названием TestFramework. TestFramework имеет следующие исходные файлы:

  • OCTest.[hm], с одного частного класса
  • OCPublic.[hm], с одним публичным классом. Он называет OCTest.
  • STest.swift, с одним публичным классом. Он вызывает OCPublic и OCTest.

У меня также есть следующие два зонтичных заголовка в той же папке, что и исходные файлы:

  • TestFramework.h, то есть тот Xcode, который создается автоматически. Я только добавил #import "OCPublic.h".
  • TestFramework_Private.h. Имеет две строки:

    #include "TestFramework.h"
    #include "OCTest.h"
    

Все они находятся в папке TestFramework вместе с Info.plist и всем остальным, что Xcode создает автоматически.

Мне удалось сделать эту компиляцию, собрать пакет фреймворка с carthage build --archive и успешно использовать полученный фреймворк в тестовом приложении со следующими картами модулей и настройками сборки:

  • TestFramework/module.modulemap существует и пуст.
  • TestFramework/module.private.modulemap существует с этими строками:

    module TestFramework_Private {
        umbrella header "TestFramework_Private.h"
        export *
    }
    
  • Обе MODULEMAP_FILE и MODULEMAP_PRIVATE_FILE в настройках сборки не установлены.

  • SWIFT_INCLUDE_PATHS - это $(PROJECT_DIR)/TestFramework.
  • DEFINES_MODULE верно.

Если я добавлю какой-либо контент (framework module TestFramework { … }) в module.modulemap или попытаюсь MODULEMAP_FILE или MODULEMAP_PRIVATE_FILE указать на их файлы (со значениями TestFramework/module.modulemap и TestFramework/module.private.modulemap), я получу различные ошибки сборки ( невозможно найти TestFramework_Private, переопределение модуля TestFramework и т. д.)

Если я удаляю пустую карту основного модуля, я получаю Нет такого модуля 'TestFramework_Private', где STest.swift пытается импортировать его.

Если я попытаюсь переместить личные вещи в отдельную папку и изменить SWIFT_INCLUDE_PATHS и MODULEMAP_PRIVATE_FILE, я получу больше ошибок при сборке.

Есть ли какие-то значения для настроек MODULEMAP*, которые должны работать, с содержимым или без него внутри основной карты модуля? Что мне делать, если я хочу переместить вещи в разные папки?

1 Ответ

0 голосов
/ 22 мая 2019

Кажется, по крайней мере, некоторые из моих проблем были вызваны этим :

При создании каркаса, в котором есть карты модулей в исходных и установочных каталогах, которые определяют один и тот же модуль, компилятор покажет сообщение переопределения. (28638816)

Обходной путь: переименуйте файл карты модулей в исходном каталоге в имя, отличное от имени по умолчанию (имя по умолчанию - module.modulemap или module.map), и установите для параметра сборки файла карты модулей значение переименованной карты модулей.

Переименование файла карты моего модуля во что-либо, кроме module.modulemap - имя, используемое, например, во всей документации Clang - позволило указать на него MODULEMAP_FILE и позволило мне переместить заголовки в другое место и т. д.

...