Нужны ли строки "рамки ссылок" в файле модуля? - PullRequest
2 голосов
/ 04 октября 2019

Некоторые файлы фреймворка поставляются с module.modulemap, которые содержат строки "link framework". Например, вот текущее содержимое Интерком module.modulemap файла :

framework module Intercom {
  umbrella header "Intercom.h"

  [...]

  link framework "Foundation"
  link framework "UIKit"
  link framework "Accelerate"
  [...]
}

Я хотел выяснить, почему необходимы строки link framework, поэтому я попытался создатьновый проект для целевого фреймворка, использующий в Xcode 10.2, но независимо от того, что я делаю, кажется, что файл module.modulemap будет просто не тронут (что понятно, кажется, что этот файл должен быть изменен вручную).

Что я хочу знать, так это почему это необходимо в первую очередь? информация о вине + соответствующие примечания к выпуску , по-видимому, предполагают, что указанные строки были добавлены для исправления проблем с динамическими структурами и дублирующимися символами , но не намного.

1 Ответ

1 голос
/ 13 октября 2019

Есть два способа сделать платформу Objective-C пригодной для использования в быстром проекте:

1) Разрешение Xcode автоматически создать файл module.modulemap, который является параметром по умолчаниюкогда вы запускаете новый каркасный проект:

Defines Module option

Итак, при компиляции проекта этот файл генерируется с конфигурацией по умолчанию:

framework module MODULE_NAME {
  umbrella header "MODULE_NAME-umbrella.h"

  export *
  module * { export * }
}

И, как правило, достаточно для большинства проектов.

2) Создание файла вручную, что соответствует вашему проекту.

В соответствии с Документация к карте модуля CLANG :

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

Объявления ссылок в картах модулей предназначены для того, чтобы стать подсказкой для цепочки инструментов, которая является фактическим двоичным файлом, который содержит код модуля. Без этого явного определения импорт каркаса в основном проекте может вызвать ошибки из-за необходимости этих исходных платформ, в основном нет такой ошибки модуля .

Итак, если у вас есть быстрый проект сзависимости динамического фреймворка, и один из них имеет тот же список зависимостей, что и ваш пример фреймворка. Если вы удалите явное объявление из файла .modulemap, вы, вероятно, увидите ошибку duplicate symbols.

Подробнееинформация, я рекомендую эту ветку Apple ответ.

...