Как я могу использовать статическую библиотеку .a в swift?

Я хочу использовать старую библиотеку webrtc.a в swift. Вы можете помочь? Я читал, что вы не можете использовать статические библиотеки в swift, это правда?

Ответ 1

Устранила ли вы эту проблему? Я тоже встречаюсь с этой проблемой, и я исправил ее на мгновение. Если вы не устранили эту проблему, вы можете попробовать следующие шаги:

p.s.: 2 проекта находятся в одном рабочем пространстве (статический проект lib и проект приложения), статический проект lib строится перед проектом приложения. Структура рабочего пространства, как показано на рисунке:

/Пользователи/raniys/Desktop/Screen Shot 2016-03-14 в 5.27.20 PM. PNG

  • В статическом проекте lib все файлы .h необходимо добавить в "Build Phases/Copy Files":

введите описание изображения здесь

  1. Перетащите файл статического файла lib (файл .a) в проект приложения, см. рис.

(путь: "проект приложения/сборка фаз/ссылка на двоичные файлы с библиотеками" )

введите описание изображения здесь

*, если вам нужна красная цветовая метка для файла .a, вам просто нужно выбрать "универсальное устройство iOS" в качестве устройства сборки для повторной сборки статического проекта lib и перетащить .a на app project (красный можно удалить)

  1. Задайте "путь поиска библиотеки" в проекте приложения:

введите описание изображения здесь

это путь к файлу .a, который построил проект: $(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/StockApp-fkjqyvsniiauxogkivalcduqeotj/Build/Products/Debug-iphoneos

  1. Создайте файл Bridging-Header для вашего проекта приложения и импортируйте в него статический lib, в моем случае я включаю "StaticLib/StaticLib.h" и "CommonFoundation/CommonFoundation.h":

введите описание изображения здесь

  1. Добавьте путь к файлу 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, может потребоваться полный набор артефактов сборки, которые находятся в своем первоначальном расположении