Проблема с фреймворками в инструменте командной строки
Прежде чем все начнут бросать в меня другие сообщения о переполнении стека и форумах: я просмотрел их все. Никто из них не помогает.
У меня есть простой инструмент 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
Теперь почистите вашу папку сборки, перестройте заново обе цели и проверьте, исправила ли это вашу проблему навсегда;)
Рекомендации
Для получения дополнительной информации обязательно проверьте следующие ссылки:
- Как добавить динамический фреймворк Swift в инструмент командной строки
- Встроенные быстродействующие фреймворки в инструментах командной строки
- Инструмент командной строки macOS с Swift Cocoa Framework: библиотека не загружена
Я также создал (очень!) Простой проект Xcode, демонстрирующий шаги, описанные выше: