Статическая библиотека и Swift

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

Моя проблема в том, что когда я пытаюсь собрать свою библиотеку в Xcode (версия 6.3), у меня появляется сообщение «Ошибка сборки», за которым следует: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: unknown option character 'X' in: -Xlinker

Я никогда такого не видел, и это не первая моя статическая библиотека. Поэтому я подумал, что это может быть связано с тем, что я использую исключительно класс Swift.

Что вы думаете, ребята ? Заранее спасибо.


person Que20    schedule 16.04.2015    source источник
comment
Принятый ответ больше не является точным. Начиная с Xcode 9 beta 4, Swift можно использовать в статических библиотеках, хотя для некоторых сценариев требуется дополнительная настройка. Смотрите мой ответ ниже.   -  person Dean Kelly    schedule 15.12.2017


Ответы (4)


Начиная с Xcode 9 beta 4, Xcode изначально поддерживает статические библиотеки с источниками Swift.

person Alessandro    schedule 20.08.2017
comment
Что мне нужно сделать, чтобы включить его? При использовании статической библиотеки, содержащей swift, как вы получаете доступ к заголовкам из проекта Objective-C? - person Hari Honor; 02.09.2017
comment
@HariKaramSingh Я ответил на вопрос OP и на ваш в отдельном ответе. - person Dean Kelly; 16.11.2017
comment
Для меня эта проблема снова начала появляться в Xcode 9.2 (9C40b) после ошибки pod update. Вероятно, Swift Pod, который я использую, изменил настройку. - person emrahgunduz; 02.03.2018

Как уже упоминалось, Apple разрешает использовать Swift в статических библиотеках, начиная с Xcode 9 Beta 4.

Мы попытались сделать это в существующем проекте с целью на основе Objective-C и проектами статической библиотеки «дочерних» и продолжали сталкиваться с ошибкой связывания.

ld: library not found for -lswiftSwiftOnoneSupport for architecture x86_64

также

ld: library not found for -lswiftDispatch for architecture x86_64

Это связано с тем, что основная цель (приложение) пытается выполнить сборку исключительно с использованием Objective-C, и статическая библиотека не сообщает, что ей необходимо включать библиотеки Swift. Это произошло потому, что в разделе Compile Sources нашего Build Phases для целевого приложения не было файлов Swift.

Итак, в основном все, что вам нужно сделать, это добавить хотя бы один файл .swift в этот список компиляции, и он будет включать в себя библиотеки Swift для вас. В нем даже не должно быть никакого кода или значений, это может быть пустой файл.

Затем вы можете начать добавлять файлы Swift в свой «дочерний» проект статической библиотеки. Я бы позволил сначала сгенерировать для вас заголовок моста, а затем вы можете перемещать его и изменять то, что импортируется (убедитесь, что проект указывает на правильный файл в настройках сборки, если вы перемещаете его).

Тем не менее, следует помнить, что использование Swift и Objective-C в пределах одной и той же статической библиотеки может иметь свои собственные проблемы. Я предлагаю прочитать документ для разработчиков Apple "Swift and Objective- C в том же проекте" о том, как решить проблему импорта Objective-C в Swift (используя связующий заголовок) и как использовать файлы Swift в коде Objective-C (импортируя сгенерированный -Swift.h для вашей библиотеки).

person Dean Kelly    schedule 16.11.2017
comment
В моем случае я видел ld: library not found for -lswiftCoreImage for architecture x86_64. Этот ответ решил мои проблемы со ссылками. - person Aaron; 22.11.2017
comment
@afarnham Я думаю, что это будет сделано практически для каждой библиотеки в ядре Swift, поскольку она пытается связать с ними при связывании материала из статической библиотеки, использующей Swift. Раньше я пытался вручную включить каждую библиотеку Swift с целевыми зависимостями и другими этапами сборки; Само собой разумеется, это был кошмар... и не работал. Я надеюсь, что Apple сделает это настройкой проекта, поэтому вам не нужно иметь фиктивный файл, чтобы обмануть основную цель, но я думаю, что сейчас это работает. - person Dean Kelly; 24.11.2017
comment
Дин Келли - я могу создать статическую библиотеку, содержащую быстрые классы. Но как я могу получить доступ к быстрому классу из статической библиотеки в основное приложение? - person V V; 14.12.2017
comment
@Vijay - это хороший кандидат на отдельный вопрос о SO. Это зависит от того, в какой тип файла вы его импортируете. Скажем, например, ваше основное приложение FooApp имеет вспомогательную статическую библиотеку под названием LibBar, а LibBar представляет собой смесь Swift и ObjC. Если вы хотите импортировать класс swift из LibBar в файл ObjC в FooApp, вам необходимо импортировать LibBar/LibBar-Swift.h. Если вы хотите использовать класс LibBar Swift в классе Swift в FooApp, есть несколько способов: заставить LibBar опубликовать модуль с картой модуля и импортировать его напрямую или импортировать LibBar/LibBar-Swift.h в ваш соединительный заголовок FooApp. - person Dean Kelly; 15.12.2017
comment
@thibautnoah Это ни в коем случае не идеальная интеграция. Вам будет нелегко перейти от Swift к ObjC между двумя статическими библиотеками (которые не являются основным приложением). Доходит до того, что имеет смысл создать соседнюю статическую библиотеку для вашего кода Swift, которая наследуется от вашей библиотеки ObjC, а затем импортировать обе из них в третью библиотеку, но для решения конкретных проблем. - person Dean Kelly; 17.01.2018
comment
У меня просто есть статическая библиотека со смесью Objective-C и Swift, и я не смог скомпилировать проект (react-native) :) - person thibaut noah; 17.01.2018
comment
Удивительно, просто добавьте пустой файл Swift, и все эти ошибки исчезнут. Спасибо за помощь! - person Max; 10.04.2018
comment
Я завидую @thibautnoah. У меня эта проблема уже несколько недель! Бесконечно благодарен! - person Tiago A.; 04.06.2018

Swift не поддерживает статическую библиотеку

Хотя правильным способом должно быть создание фреймворка, есть обходной путь здесь.

person Giordano Scalzo    schedule 16.04.2015
comment
Это довольно раздражает. Спасибо за ваш ответ. - person Que20; 16.04.2015
comment
Привет, поскольку Swift не поддерживает статическую библиотеку, как я могу запретить своим коллегам читать мой код? (Речь идет о шифровании данных, поэтому чем меньше людей об этом знает, тем лучше). Мое приложение также поддерживает iOS 7, поэтому я не могу использовать фреймворк, верно? - person Pham Hoan; 22.06.2015
comment
может потребоваться обновление до сих пор? Swift теперь поддерживает как фреймворк, так и статическую библиотеку? - person Forrest; 20.09.2015
comment
Из проекта target c мы можем создать статическую библиотеку, но возможно ли создать статическую библиотеку из проекта Swift с xcode 8 - person Durai Amuthan.H; 11.03.2017
comment
Есть ли какое-либо решение, использующее статическую библиотеку в Swift 3, у меня есть библиотека шифрования, в которой есть только два файла .a на образце поставщиков (написанном в target-c), это рабочий файл. Когда я пытался использовать эту библиотеку с использованием заголовка моста, ( очевидно, что конфигурация заголовка моста в порядке, так как другие библиотеки Objective-C работают нормально на ), он не может выдавать ошибку. У любого есть решение по этой проблеме, а затем опубликуйте подсказку. - person dip; 11.06.2017
comment
Swift теперь поддерживает статическую библиотеку. Этот ответ очень старый. - person pebble8888; 20.04.2020

Swift Consumer -> Статическая библиотека Swift

Xcode версии 10.2.1

Создать статическую библиотеку Swift

Создайте проект библиотеки или создайте цель библиотеки

File -> New -> Project... -> Cocoa Touch Static Library
//or
Project editor -> Add a Target -> Cocoa Touch Static Library 

Добавить файлы .swift

Select `.swift` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files

Построить библиотеку — ⌘ Command + B или Product -> Build

Примечание 1. Убедитесь, что вы создаете библиотеку для той же архитектуры процесса, что и клиентский код.
Примечание 2. Предоставьте свой API, который должен быть виден потребителю, используя модификаторы доступа public или open[О программе]

Найдите сгенерированный вывод[Место сборки]

Products group -> lib<product_name>.a -> Show in Finder

Каталог включает в себя

  • lib<product_name>.a — встроенная статическая библиотека
  • <product_name>.swiftmodule. swiftmodule описывают интерфейс библиотеки и версию компилятора. В эту папку входят:
  • .swiftdoc - документы
  • .swiftmodule - публичный интерфейс/определения

Потребитель Swift со статической библиотекой Swift

Drag and drop двоичный файл в проект Xcode[О программе]

Link Binary[Неопределенные символы] [Ссылка вместо вставки]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<target_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<target_name>.a` file

Добавьте Library Search paths(LIBRARY_SEARCH_PATHS)[Библиотека не найдена для] [Рекурсивный путь]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<target_name>.a` file

Добавьте Import Paths[Нет такого модуля] [Рекурсивный путь]

Project editor -> select a target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths -> add path to a folder with `.swiftmodule`

Импорт модуля в клиентский код Swift [module_name]

import module_name

[Дополнительные примеры]

person yoAlex5    schedule 29.04.2019
comment
Я построил статическую структуру в своем собственном автономном проекте. Я вижу файл .a и папку .swiftmodule. Я должен перетащить их обоих в свое хост-приложение, а затем попытаться найти пути. Правильно? - person Honey; 14.08.2019
comment
Извините, что спрашиваю, а есть какие-нибудь заметки по этому поводу? - person Honey; 16.08.2019
comment
Здравствуйте @Honey, я проверю еще раз и предоставлю вам информацию - person yoAlex5; 16.08.2019
comment
@Honey, отвечая на ваш вопрос, после создания библиотеки вы должны выполнить 3 шага: 1. Перетащите файл .a в ваше хост-приложение в раздел Linked Frameworks and Libraries. 2. Укажите путь к .a Fine в разделе Library Search paths 3. Укажите путь к .swiftmodule Fine в разделе Import Paths. Я только что проверил учебник и обновил сообщение. Если у вас есть какие-то проблемы, не стесняйтесь спрашивать - person yoAlex5; 16.08.2019
comment
@yoAlex5, большое спасибо за подробное и исчерпывающее объяснение. Единственное, что я хотел бы добавить, это то, что вы не должны забывать помечать свои классы и методы public, чтобы сделать их доступными в других целях. Без этого вы сможете импортировать библиотеку, но не сможете использовать ее код. Также обратите внимание, что init должны быть опубликованы явным образом. - person Rostyslav Druzhchenko; 08.10.2019