Проблема с фреймворками в инструменте командной строки

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

У меня есть простой инструмент 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]

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

0 ответов

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

Мы должны:

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

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

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

Это довольно просто. Измените следующие параметры сборки для SwizzleSrc Рамочная цель:

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

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

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

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

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

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

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

Добавьте следующие записи пути поиска пути к swizzler Цель инструмента (в настройках сборки):

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

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

Рекомендации

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

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

Другие вопросы по тегам