Проблема с фреймворками в инструменте командной строки - PullRequest
0 голосов
/ 08 февраля 2019

Прежде чем все начнут бросать в меня другие сообщения о переполнении стека и форумах: я просмотрел их все.Никто из них не помогает.

У меня есть простой инструмент cmd swizzler, и я хочу встроить в него фреймворк SwizzleSrc.Я следовал всем урокам и переполнению стека без удачи.Вот что я получаю.

Сборка

2019-02-07 19:22:46.785680-0500 Terminal[67444:11837029] flock failed to lock maps file: errno = 35
2019-02-07 19:22:46.786939-0500 Terminal[67444:11837029] flock failed to lock maps file: errno = 35

Запуск

Last login: Thu Feb  7 19:21:08 on ttys018
NAME-iMac:~ NAME$ /Users/NAME/Library/Developer/Xcode/DerivedData/swizzler-aslysekmorknabdslxbxfaeuiztk/Build/Products/Debug/swizzler ; exit;
dyld: Library not loaded: @rpath/SwizzleSrc.framework/Versions/A/SwizzleSrc
  Referenced from: /Users/NAME/Library/Developer/Xcode/DerivedData/swizzler-aslysekmorknabdslxbxfaeuiztk/Build/Products/Debug/swizzler
  Reason: image not found
Abort trap: 6
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]

Может кто-нибудь помочь, пожалуйста?Я пытался в течение нескольких дней безрезультатно.

1 Ответ

0 голосов
/ 05 марта 2019

Чтобы исправить вашу проблему, нам нужно изменить способ, которым Xcode обрабатывает Swift Инструмент командной строки целей по умолчанию, в частности соглашение о связывании со стандартными библиотеками Swift.

Нам нужно:

  • встраивает стандартные библиотеки Swift в вашу SwizzleSrc framework
  • заставляет ваш исполняемый файл командной строки swizzler динамически связывать все библиотеки Swift
  • и наконец, убедитесь, что ваш *Затем исполняемый файл 1014 * может найти все необходимые библиотеки Swift (теперь он находится в целевом фреймворке)

Давайте начнем (предполагается, что вы используете Xcode 10.1 или выше):

Встраивание библиотек Swift в Framework

Это довольно просто.Измените следующие Настройки сборки для целевого фреймворка SwizzleSrc:

  • Всегда встраивать Swift Стандартные библиотеки в Да

Динамическое связывание всех библиотек Swift с помощью инструмента командной строки

Это довольно сложная часть.Добавьте следующие Определяемые пользователем настройки для цели инструмента swizzlerНастройки сборки ):

  • SWIFT_FORCE_DYNAMIC_LINK_STDLIB, установленный на YES
  • SWIFT_FORCE_STATIC_LINK_STDLIB установлен на NO

(Чтобы добавить новую Определяемую пользователем настройку, просто нажмите кнопку + чуть ниже Настройки сборки заголовок вкладки.)

Это обеспечит динамическое связывание всех исполняемых файлов вашей командной строки вместо этого (т. Е. По умолчанию они статически )связаны).Кстати, эти же настройки используются диспетчером пакетов Swift для исправления связанной проблемы.

Обновите путь выполнения для инструмента командной строки

Добавьте следующий Путь поиска пути выполнения записей для цели инструмента swizzlerНастройки сборки ):

  • @executable_path
  • @executable_path/SwizzleSrc.framework/Versions/Current/Frameworks

Теперь очистите папку сборки, перестройте заново обе цели и проверьте, исправила ли это вашу проблему навсегда;)

Ссылки

Для получения дополнительной информацииОбязательно проверьте следующие ссылки:

Я также создал (очень!) Простой проект Xcode, демонстрирующийвышеописанные шаги:

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