Избегайте автоматического связывания фреймворка в Swift - PullRequest
0 голосов
/ 11 января 2019

У меня есть пример проекта , состоящий из основной цели (LinkerTests) и зависимой динамической структуры (Dynamic).

Если вы запустите проект, вы увидите следующую бинарную загрузку dyld:

dyld: loaded: {DerivedDataPath}/Build/Products/Debug-iphonesimulator/Dynamic.framework/Dynamic

Эта двоичная нагрузка dyld происходит из-за import Dynamic в AppDelegate.swift, несмотря на следующее:

  1. Link Binary With Libraries фаза сборки пуста
  2. CLANG_MODULES_AUTOLINK имеет значение false

Чего мне нужно, так это избежать автоматического неявного связывания. Это возможно? Заранее спасибо!


Смежный вопрос: Разве нам больше не нужно связывать фреймворк с проектом XCode?

1 Ответ

0 голосов
/ 13 января 2019

Видимо, эта функция называется автоматическим связыванием. Компилятор Swift неявно испускает дополнительные флаги компоновщика, которые связывают все модули, от которых зависит исходный код (import Dynamic).

Нет способа полностью отключить это. Но есть частный флаг компилятора, который позволяет отключить автоподключение для единого фреймворка: swiftc -disable-autolink-framework <framework>.

Некоторые ссылки: https://gist.github.com/zrzka/c89705ff634ea01aebc1 https://github.com/niw/automatic_linking_tool/blob/master/README.md

Я уверен, что вы можете добавить -v к swiftc, и он будет печатать все основные вызовы в виде команд. Надеюсь, вы также сможете увидеть вызовы компоновщика.

Вы должны использовать флаг -Xfrontend для достижения желаемых результатов:

OTHER_SWIFT_FLAGS = "-Xfrontend -disable-autolink-framework -Xfrontend Dynamic"
...