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

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

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

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


person Import Accelerate    schedule 08.02.2019    source источник
comment
Вы уже нашли решение этой проблемы? Спасибо!   -  person Paulo Mattos    schedule 19.02.2019
comment
К сожалению, пока нет.   -  person Import Accelerate    schedule 02.03.2019


Ответы (1)


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

Нам нужно:

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

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

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

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

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

Динамическое связывание всех библиотек 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, демонстрирующий шаги, описанные выше:

person Paulo Mattos    schedule 05.03.2019
comment
Я протестировал все описанные выше шаги на чистом проекте Xcode (содержащем только эти две цели), и он работал нормально. Кстати, я получил ту же ошибку, что и вы раньше. В любом случае, сегодня я попытаюсь загрузить свой проект на GitHub... - person Paulo Mattos; 06.03.2019
comment
Привет, @ImportAccelerate, я загрузил простой проект Xcode, выполнив шаги, описанные в моем ответе: github. com/pmattos/Swift-CLI-with-Framework - person Paulo Mattos; 08.03.2019