Создание и использование быстрой статической библиотеки в Xcode 10.1

Я планирую создать быструю статическую библиотеку и использовать ее в приложении iOS Swift. Я создаю быстрый вызов статической библиотеки SimpleLib, и он включает приветствие открытого класса, которое возвращает строку Hello World:

//
//  Greeting.swift
//  SimpleLib
//

import Foundation

public class Greeting {
   public func Hello() -> String {
     return "Hello World";
   }
   public init() {

   }

   public static func SayMorning() -> String{
      return "Hi, Morning";
   }
}

Проект быстрой статической библиотеки выглядит так:

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

И module.modulemap определяется следующим образом:

module SimpleLib {
  header "SimpleLib-Swift.h"
  export *
}

Я создаю и создаю файл libSimpleLib.a, я помещаю .a и другие файлы (на которые ссылаются другие сообщения в Интернете, чтобы указать, что нужно поместить в папку приложения) в папку приложения:

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

В проекте приложения я включаю путь Libs в FREAMEWORK_SEARCH_PATHS, LIBRARY_SEARCH_PATHS и HEADER_SEARCH_PATHS и включаю файл .a в Linked Framework.

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

Однако, когда я пытаюсь сослаться на класс Greeting в AppDelegate, я получаю сообщение об ошибке — Использование неразрешенного идентификатора «Приветствие».

//
//  AppDelegate.swift
//  testStatic
//

import UIKit
import SimpleLib


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

   var window: UIWindow?

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      // Override point for customization after application launch.
      var s = Greeting
      return true
   }
 ......
 }

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

Как создавать объекты Swift в статической библиотеке, можно найти в приложении. Каковы правильные шаги для экспорта класса/функций в быструю статическую библиотеку? Кому-нибудь удалось создать и использовать быструю статическую библиотеку в приложении iOS?


person interman    schedule 16.01.2019    source источник
comment
Вы должны скопировать свой код вместо публикации скриншотов. Скриншоты нельзя обрабатывать как текст, что вызывает много проблем. Люди, прочитавшие ваш вопрос, не смогут скопировать ваш код, чтобы попробовать его, а люди, которые полагаются на программы чтения с экрана, не смогут узнать, что это за код.   -  person zneak    schedule 17.01.2019
comment
Я обновляю и копирую свой код в сообщение. Надеюсь, это поможет понять мои вопросы   -  person interman    schedule 17.01.2019


Ответы (4)


Включите свой путь module.modulemap и arm64.swiftmodule в параметр SWIFT_INCLUDE_PATHS приложения.

person kubrick G    schedule 25.01.2019

Проблема в том, что ваш класс имеет то же имя, что и ваш модуль. Попробуйте simple.simple() создать экземпляр вашего класса или, альтернативно, переименовать либо модуль, либо класс.

person zneak    schedule 16.01.2019
comment
Извините, это не помощь. - person interman; 17.01.2019

Обязательно добавьте библиотеку .a и соответствующий .swiftmodule из продукта сборки в файлы приложения. Затем свяжите библиотеку .a в «Linked Framework and Libraries», а также убедитесь, что она присутствует на этапах сборки в «Link Binary with Libraries».

Наконец, в настройках сборки в разделе «Компилятор Swift — Пути поиска» > «Пути импорта» добавьте путь к папке .swiftmodule. Пути относятся к .xcodeproject.

Убедитесь, что используемые вами классы и методы открыты или общедоступны.

person Jonathan Pinlac    schedule 02.10.2019

Это способ создать статическую библиотеку в Objective-C и Access в быстром приложении. выполните следующие действия.

Как импортировать файл проекта статической библиотеки Objective-C в Swift Sample Codebase для отладки.

Шаг 1. Скопируйте и вставьте полный исходный код SDK в каталог примера проекта.

Шаг 2. Добавьте файл проекта статической библиотеки в пример кода.

Шаг 3. Добавьте зависимость библиотеки (TestStaticLib.a) и требуемую библиотеку C++ или структуру curl или lumberjack и т. д.

Выберите target-> Build Phases-> Add Library and framework.

Шаг 4. Связь зависимости

Выберите + и добавьте зависимость универсальной библиотеки.

Шаг 6. Задайте путь поиска заголовков для файлов библиотеки .h

Выберите цель-> Настройка сборки-> Путь поиска заголовка

Укажите путь к библиотеке, например «$(SRCROOT)/ConnectSDKApp/TestStaticLib».

Шаг 7. Скомпилируйте универсальную библиотеку

Откройте целевую библиотеку отдельно и скомпилируйте универсальную библиотеку.

После завершения компиляции. Проверьте путь к библиотеке в универсальной папке независимо от того, создан файл .a или нет.

Если создан нормально. В противном случае проверьте, почему он не создается. .a файл, созданный с помощью скрипта. Который в

Универсальная цель библиотеки -> Фаза сборки и запуск сценария.

Если файл .a не создан, нет необходимости в образце кода. Модуль не будет компилироваться. Файл не создан.

ВОПРОСЫ-ОТВЕТЫ.

  1. Не удалось найти файл .h в заголовке, который вы связали в заголовке моста и пытались получить доступ, как показано ниже.

импорт

импорт

Ответы. Вы не указали правильный путь поиска заголовка. Пожалуйста, проверьте шаг и укажите правильный путь поиска заголовка.

  1. Ошибка компоновщика Отсутствует класс ServiceManager Objective C.

Ответы. Ссылка зависимости вашей универсальной библиотеки шаг 4

Вопрос 3. Сбой приложения… по этой причине

причина: '*** -[__NSDictionaryM setObject:forKey:]: объект не может быть нулевым (ключ: com.hac.mapService.TomTom)'

Ответы.

Вопрос 4. Универсальный файл .a не создается после успешной сборки.

Ответы. Проверьте скрипт, возможно, что-то не так со скриптом.

Вопрос 5. Какая польза от скрипта.

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

Файл TestStaticLib.a компилируется в одно и то же время для устройства и симулятора только при создании с архитектурой устройства и симулятора.

Хотите получить доступ к .a static в своем проекте.

Шаг 1. Добавьте универсальную библиотеку (TestStaticLib.a) в пример кода, который будет компилироваться как для симулятора, так и для устройств.

Шаг 2. Добавьте зависимость библиотеки (TestStaticLib.a) и требуемую библиотеку C++ или структуру curl или lumberjack и т. д.

Выберите target-> Build Phases-> Add Library and framework.

Шаг 3. Импортируйте файл .h в заголовок Bridge

Скомпилировать.

person Ashi    schedule 29.01.2020