Как я могу использовать статическую библиотеку.a в swift?
Я хочу использовать статическую библиотеку webrtc .a в swift. Можете ли вы помочь, пожалуйста? Я читал, что вы не можете использовать статические библиотеки в swift, это правда?
3 ответа
Вы исправили эту проблему, которую вы спросили? Я столкнулся с этой проблемой и сегодня, и я исправил ее на мгновение. Если вы не устранили эту проблему, попробуйте выполнить следующие действия:
PS: 2 проекта находятся в одной рабочей области (статический проект lib и проект App), статический проект lib создается перед проектом приложения. Структура рабочего пространства, как показано на рисунке:
- В статическом проекте lib все файлы.h необходимо добавить в "Фазы сборки / Копирование файлов":
- Перетащите статический файл продукта lib (файл.a) в проект приложения, см. Рис.
(путь: "проект приложения / этапы сборки / связать двоичные файлы с библиотеками")
* если вам нужна красная метка для файла.a, вам просто нужно выбрать "универсальное устройство iOS" в качестве устройства для сборки, чтобы пересобрать статический проект lib, и перетащить.a в проект приложения (красный можно удалить)
- Установите "Путь поиска библиотеки" в проекте приложения:
это путь к файлу.a, который встроил проект: $(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/StockApp-fkjqyvsniiauxogkivalcduqeotj/Build/Products/Debug-iphoneos
- Создайте файл Bridging-Header для своего проекта приложения и импортируйте в него статическую библиотеку, в моем случае я включаю "StaticLib/StaticLib.h" и "CommonFoundation/CommonFoundation.h":
- Добавьте путь к файлу Bridging-Header к "Objective-C Bridging Header" вашего проекта приложения:
Тогда все готово, теперь вы можете использовать функции статических библиотек.
Использование классов Objective-C в Swift
Если вы собираетесь импортировать код в App Target (сочетание Swift и Objective-C в одном проекте), вам следует использовать bridging header
файл, чтобы предоставить код Objective-C коду Swift. [Смешивание кода Swift и Objective-C в проекте]
В этом посте я опишу, как импортировать статическую библиотеку Objective-C в код Swift.
Swift consumer -> Статическая библиотека Objective-C
Xcode версии 10.2.1
Создать статическую библиотеку Objective-C
Создайте проект библиотеки или создайте целевую библиотеку
File -> New -> Project... -> Cocoa Touch Static Library
//or
Project editor -> Add a Target -> Cocoa Touch Static Library
Создайте module.modulemap
файл [О программе]
module module_name {
umbrella header "module_name-umbrella.h"
export *
}
Создайте module_name-umbrella.h
файл [О программе] и добавить все.h
файлы, которые будут открыты для потребителя
#import "header_1.h"
#import "header_2.h"
добавлять module.modulemap
а также module_name-umbrella.h
файлы в Copy Files
раздел [О программе].
Project editor -> select a target -> Build Phases -> Copy Files -> add `module.modulemap`, `module_name-umbrella.h`
Добавить файлы реализации .m
Select `.m` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files
Добавить файлы заголовков .h
которые были перечислены в module_name-umbrella.h
(header_1.h
, header_2.h
) [не могу это сделать] [общедоступное целевое членство]
Select `.h` file -> Select File Inspectors Tab -> Target Membership -> Select the target and make it **public**
//or
Project editor -> select a target -> Build Phases -> Headers -> add files to the **public** zone
Библиотека сборки - ⌘ Command+ B илиProduct -> Build
Примечание. Убедитесь, что вы создаете библиотеку для той же архитектуры процесса, что и клиентский код.
Найти сгенерированные выходные данные [Место сборки]
Products group -> lib<product_name>.a -> Show in Finder
Каталог включает
lib<product_name>.a
- встроенная статическая библиотекаinclude/<product_name>
папка с файлами изCopy Files
разделusr/local/include
папка с файлами изHeaders
раздел. Есть общедоступные интерфейсы / определения
Быстрый потребитель со статической библиотекой Objective-C
Drag and drop
двоичный файл в проект Xcode [О программе]
Link Library
[Неопределенные символы] [Ссылка против встраивания]
Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
добавлять Library Search paths
[Библиотека не найдена для] [Рекурсивный путь]
Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file
добавлять Header Search Paths
[Модуль не найден] [Рекурсивный путь]
Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `include/<product_name>` folder with `module.modulemap` and `<product_name>-umbrella.h`
Импортировать модуль в клиентский код Swift [имя_модуля]
import module_name
Да, вы можете использовать статические библиотеки в Swift. Перейдите к этапам сборки и в разделе "Связать двоичные файлы с библиотеками" и добавьте их туда.
Кроме того, вы можете зайти в "Настройки сборки" и в "Пути поиска" добавить значение "Пути поиска в библиотеке", чтобы указать путь к папке, в которой находится ваш файл.a.
Вы можете добавить заголовки для вашей библиотеки таким же образом в разделе "Пути поиска заголовков"
Также имейте в виду, что если эта библиотека написана на Objective-C, вам понадобится Bridging Header, чтобы использовать ее в Swift.
Если вы собираетесь импортировать код в App Target, вы должны использовать bridging header
файл для представления кода Objective C в код Swift. Узнайте больше здесь
В этом посте я опишу, как импортировать статическую библиотеку Objective-C в код Swift.
Swift consumer -> Objective-C статическая библиотека
Версия Xcode 10.2.1
Создайте статическую библиотеку Objective-C или создайте статическую библиотеку Objective-C Target
Создать проект библиотеки
File -> New -> Project... -> Cocoa Touch Static Library -> Enter necessary information and choose Language -> Objective-C
Создайте module.modulemap
файл
module module_name {
umbrella header "module_name-umbrella.h"
export *
}
добавлять .h
файлы в module_name-umbrella.h
это будет открыто для потребителя
#import "header_1.h"
#import "header_2.h"
Добавление файлов копирования Фаза сборки
Project editor -> select a target -> Build Phases -> Copy Files -> add `module.modulemap`, `module_name-umbrella.h`
Добавить заголовки
Project editor -> select a target -> Build Phases -> Headers(If it doesn't exist -> + at the top -> New Headers Phase) -> add all `.h` files from `module_name-umbrella.h`(`header_1.h`, `header_2.h`)
Сборка библиотеки
Примечание. Убедитесь, что вы создали библиотеку для той же архитектуры процессов, что и код клиента.
Найти сгенерированный вывод
Products group -> lib<module_name>.a -> Show in Finder
Примечание: по умолчанию он будет находиться в подпапке DerivedData
папка (ее можно изменить, если удалить DerivedData
в процессе разработки и перестроить его заново).
В каталог входят
lib<module_name>.a
- встроенная статическая библиотекаmodule.modulemap
файлmodule_name-umbrella.h
файлusr/local/include
папка, которая включает.h
файлы изmodule_name-umbrella.h
- открытые интерфейсы / определения
Использование статической библиотеки Objective-C
Link Binary With Libraries
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<module_name>.a` file
добавлять Library Search paths
Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<module_name>.a` file
добавлять Header Search Paths
Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `include` folder (or a path to the parent of generated `module_name` folder with `.h` files)
- Когда вы установите
path
Вы можете определить путь к одной из родительских папок и установитьrecursive
(/**
будет добавлен в конец пути). Например, вы можете осквернитьpath
вBuild
каталог сrecursive
параметр. - Если
patch
содержит пробелы -, вы должны избежать их, используя
\
или заключите путь в двойные кавычки""
Модуль импорта в клиентский код Swift
import module_name
Objective-C потребитель -> Objective-C статическая библиотека
С Xcode 9 используются статические библиотеки, поддерживаемые Swift. Вы можете использовать как использование в Objective-C. Примечания к выпуску XCode
Xcode поддерживает статические целевые библиотеки, которые содержат код Swift. Для отладки приложений, использующих статические библиотеки Swift, может потребоваться полный набор артефактов сборки, которые находятся в своем первоначальном расположении