Я хочу использовать старую библиотеку webrtc.a в swift. Вы можете помочь? Я читал, что вы не можете использовать статические библиотеки в swift, это правда?
Как я могу использовать статическую библиотеку .a в swift?
Ответ 1
Устранила ли вы эту проблему? Я тоже встречаюсь с этой проблемой, и я исправил ее на мгновение. Если вы не устранили эту проблему, вы можете попробовать следующие шаги:
p.s.: 2 проекта находятся в одном рабочем пространстве (статический проект lib и проект приложения), статический проект lib строится перед проектом приложения. Структура рабочего пространства, как показано на рисунке:
- В статическом проекте lib все файлы .h необходимо добавить в "Build Phases/Copy Files":
- Перетащите файл статического файла lib (файл .a) в проект приложения, см. рис.
(путь: "проект приложения/сборка фаз/ссылка на двоичные файлы с библиотеками" )
*, если вам нужна красная цветовая метка для файла .a, вам просто нужно выбрать "универсальное устройство iOS" в качестве устройства сборки для повторной сборки статического проекта lib и перетащить .a на app project (красный можно удалить)
- Задайте "путь поиска библиотеки" в проекте приложения:
это путь к файлу .a, который построил проект: $(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/StockApp-fkjqyvsniiauxogkivalcduqeotj/Build/Products/Debug-iphoneos
- Создайте файл Bridging-Header для вашего проекта приложения и импортируйте в него статический lib, в моем случае я включаю "StaticLib/StaticLib.h" и "CommonFoundation/CommonFoundation.h":
- Добавьте путь к файлу Bridging-Header в "Objective-C Bridging Header" вашего проекта приложения:
Затем все сделано, теперь вы можете использовать функции статических библиотек.
Ответ 2
Использование классов Objective C в Swift
Если вы собираетесь импортировать код в пределах цели приложения (Mixing Swift и Objective-C в одном проекте), вам следует использовать файл bridging header
, чтобы представить код Objective C для кода Swift. [Mixing Swift and Objective-C code in a project]
В этом посте я опишу, как импортировать статическую библиотеку Objective-C в код Swift
Swift customer → статическая библиотека 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
[About]
module module_name {
umbrella header "module_name-umbrella.h"
export *
}
Создайте файл module_name-umbrella.h
[About] и добавьте все файлы .h
, которые будут открыты для потребителя
#import "header_1.h"
#import "header_2.h"
Добавьте файлы module.modulemap
и module_name-umbrella.h
в раздел Copy Files
[About].
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
)[can not do it] [public target membership]
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
Примечание. Убедитесь, что вы создали библиотеку для той же архитектуры процессов, что и код клиента.
Найти сгенерированный вывод[Build location]
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[About]
Link Library
[Undefined symbols] [Link vs Embed]
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
[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<product_name>.a' file
Добавить Header Search Paths
[Module not found] [Recursive path]
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[module_name]
import module_name
Ответ 3
Да, вы можете использовать статические библиотеки в Swift. Перейдите к своим фазам сборки и в разделе "Связывание двоичных файлов с библиотеками" и добавьте их туда.
В качестве альтернативы вы можете войти в "Настройки сборки", а в "Пути поиска" добавить значение "Пути поиска библиотеки", чтобы включить путь к папке, в которой находится ваш .a файл.
Вы можете добавить заголовки для своей библиотеки так же, как в "Пути поиска заголовков"
Также имейте в виду, что если эта библиотека написана в Objective-C, для ее использования в Swift вам понадобится заголовок Bridging.
Ответ 4
С Xcode 9 используются статические библиотеки, поддерживаемые Swift. Вы можете использовать как использование в Objective-C. Примечания к выпуску XCode
Xcode поддерживает статические целевые библиотеки, которые содержат код Swift. Для отладки приложений, использующих статические библиотеки Swift, может потребоваться полный набор артефактов сборки, которые находятся в своем первоначальном расположении