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

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

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

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

Что вы, ребята, думаете? Заранее благодарю вас.

Ответы

Ответ 1

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

Ответ 2

Как уже упоминалось, 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 и Objective-C в одном проекте" о том, как решить проблему импорта Objective-C в Swift (с помощью соединительного заголовка) и как использовать файлы Swift в коде Objective-C (импортировать сгенерировал -Swift.h для вашей библиотеки).

Ответ 4

Потребитель Swift → Статическая библиотека 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[About]

Найти сгенерированный вывод[Build location]

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

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

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

Использование статической библиотеки Swift

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

Link Binary[Undefined symbols] [Link vs Embed]

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 not found for] [Recursive path]

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[No such module] [Recursive path]

Project editor -> select a target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths -> add path to the parent of '.swiftmodule' folder

Импортировать модуль в код клиента Swift [module_name]

import module_name

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